{"id":1387,"date":"2024-06-02T22:33:12","date_gmt":"2024-06-02T22:33:12","guid":{"rendered":""},"modified":"2024-06-05T03:10:11","modified_gmt":"2024-06-04T19:10:11","slug":"javascript%e6%b7%b1%e5%85%a5%e4%b9%8b%e4%bb%8eecmascript%e8%a7%84%e8%8c%83%e8%a7%a3%e8%af%bbthis","status":"publish","type":"post","link":"https:\/\/www.lccc.top\/?p=1387","title":{"rendered":"JavaScript\u6df1\u5165\u4e4b\u4eceECMAScript\u89c4\u8303\u89e3\u8bfbthis"},"content":{"rendered":"<td class=\"d-block comment-body markdown-body  js-comment-body\">\n<h2 dir=\"auto\">\u524d\u8a00<\/h2>\n<p dir=\"auto\">\u5728\u300aJavaScript\u6df1\u5165\u4e4b\u6267\u884c\u4e0a\u4e0b\u6587\u6808\u300b\u4e2d\u8bb2\u5230\uff0c\u5f53JavaScript\u4ee3\u7801\u6267\u884c\u4e00\u6bb5\u53ef\u6267\u884c\u4ee3\u7801(executable code)\u65f6\uff0c\u4f1a\u521b\u5efa\u5bf9\u5e94\u7684\u6267\u884c\u4e0a\u4e0b\u6587(execution context)\u3002<\/p>\n<p dir=\"auto\">\u5bf9\u4e8e\u6bcf\u4e2a\u6267\u884c\u4e0a\u4e0b\u6587\uff0c\u90fd\u6709\u4e09\u4e2a\u91cd\u8981\u5c5e\u6027<\/p>\n<ul dir=\"auto\">\n<li>\u53d8\u91cf\u5bf9\u8c61(Variable object\uff0cVO)<\/li>\n<li>\u4f5c\u7528\u57df\u94fe(Scope chain)<\/li>\n<li>this<\/li>\n<\/ul>\n<p dir=\"auto\">\u4eca\u5929\u91cd\u70b9\u8bb2\u8bb2 this\uff0c\u7136\u800c\u4e0d\u597d\u8bb2\u3002<\/p>\n<p dir=\"auto\">\u2026\u2026<\/p>\n<p dir=\"auto\">\u56e0\u4e3a\u6211\u4eec\u8981\u4ece ECMASciript5 \u89c4\u8303\u5f00\u59cb\u8bb2\u8d77\u3002<\/p>\n<p dir=\"auto\">\u5148\u5949\u4e0a ECMAScript 5.1 \u89c4\u8303\u5730\u5740\uff1a<\/p>\n<p dir=\"auto\">\u82f1\u6587\u7248\uff1a<a href=\"http:\/\/es5.github.io\/#x15.1\" rel=\"nofollow\">http:\/\/es5.github.io\/#x15.1<\/a><\/p>\n<p dir=\"auto\">\u4e2d\u6587\u7248\uff1a<a href=\"http:\/\/yanhaijing.com\/es5\/#115\" rel=\"nofollow\">http:\/\/yanhaijing.com\/es5\/#115<\/a><\/p>\n<p dir=\"auto\">\u8ba9\u6211\u4eec\u5f00\u59cb\u4e86\u89e3\u89c4\u8303\u5427\uff01<\/p>\n<h2 dir=\"auto\">Types<\/h2>\n<p dir=\"auto\">\u9996\u5148\u662f\u7b2c 8 \u7ae0 Types\uff1a<\/p>\n<blockquote>\n<p dir=\"auto\">Types are further subclassified into ECMAScript language types and specification types.<\/p>\n<\/blockquote>\n<blockquote>\n<p dir=\"auto\">An ECMAScript language type corresponds to values that are directly manipulated by an ECMAScript programmer using the ECMAScript language. The ECMAScript language types are Undefined, Null, Boolean, String, Number, and Object.<\/p>\n<\/blockquote>\n<blockquote>\n<p dir=\"auto\">A specification type corresponds to meta-values that are used within algorithms to describe the semantics of ECMAScript language constructs and ECMAScript language types. The specification types are Reference, List, Completion, Property Descriptor, Property Identifier, Lexical Environment, and Environment Record.<\/p>\n<\/blockquote>\n<p dir=\"auto\">\u6211\u4eec\u7b80\u5355\u7684\u7ffb\u8bd1\u4e00\u4e0b\uff1a<\/p>\n<p dir=\"auto\">ECMAScript \u7684\u7c7b\u578b\u5206\u4e3a\u8bed\u8a00\u7c7b\u578b\u548c\u89c4\u8303\u7c7b\u578b\u3002<\/p>\n<p dir=\"auto\">ECMAScript \u8bed\u8a00\u7c7b\u578b\u662f\u5f00\u53d1\u8005\u76f4\u63a5\u4f7f\u7528 ECMAScript \u53ef\u4ee5\u64cd\u4f5c\u7684\u3002\u5176\u5b9e\u5c31\u662f\u6211\u4eec\u5e38\u8bf4\u7684Undefined, Null, Boolean, String, Number, \u548c Object\u3002<\/p>\n<p dir=\"auto\">\u800c\u89c4\u8303\u7c7b\u578b\u76f8\u5f53\u4e8e meta-values\uff0c\u662f\u7528\u6765\u7528\u7b97\u6cd5\u63cf\u8ff0 ECMAScript \u8bed\u8a00\u7ed3\u6784\u548c ECMAScript \u8bed\u8a00\u7c7b\u578b\u7684\u3002\u89c4\u8303\u7c7b\u578b\u5305\u62ec\uff1aReference, List, Completion, Property Descriptor, Property Identifier, Lexical Environment, \u548c Environment Record\u3002<\/p>\n<p dir=\"auto\">\u6ca1\u61c2\uff1f\u6ca1\u5173\u7cfb\uff0c\u6211\u4eec\u53ea\u8981\u77e5\u9053\u5728 ECMAScript \u89c4\u8303\u4e2d\u8fd8\u6709\u4e00\u79cd\u53ea\u5b58\u5728\u4e8e\u89c4\u8303\u4e2d\u7684\u7c7b\u578b\uff0c\u5b83\u4eec\u7684\u4f5c\u7528\u662f\u7528\u6765\u63cf\u8ff0\u8bed\u8a00\u5e95\u5c42\u884c\u4e3a\u903b\u8f91\u3002<\/p>\n<p dir=\"auto\">\u4eca\u5929\u6211\u4eec\u8981\u8bb2\u7684\u91cd\u70b9\u662f\u4fbf\u662f\u5176\u4e2d\u7684 Reference \u7c7b\u578b\u3002\u5b83\u4e0e this \u7684\u6307\u5411\u6709\u7740\u5bc6\u5207\u7684\u5173\u8054\u3002<\/p>\n<h2 dir=\"auto\">Reference<\/h2>\n<p dir=\"auto\">\u90a3\u4ec0\u4e48\u53c8\u662f Reference \uff1f<\/p>\n<p dir=\"auto\">\u8ba9\u6211\u4eec\u770b 8.7 \u7ae0 The Reference Specification Type\uff1a<\/p>\n<blockquote>\n<p dir=\"auto\">The Reference type is used to explain the behaviour of such operators as delete, typeof, and the assignment operators.<\/p>\n<\/blockquote>\n<p dir=\"auto\">\u6240\u4ee5 Reference \u7c7b\u578b\u5c31\u662f\u7528\u6765\u89e3\u91ca\u8bf8\u5982 delete\u3001typeof \u4ee5\u53ca\u8d4b\u503c\u7b49\u64cd\u4f5c\u884c\u4e3a\u7684\u3002<\/p>\n<p dir=\"auto\">\u6284\u88ad\u5c24\u96e8\u6eaa\u5927\u5927\u7684\u8bdd\uff0c\u5c31\u662f\uff1a<\/p>\n<blockquote>\n<p dir=\"auto\">\u8fd9\u91cc\u7684 Reference \u662f\u4e00\u4e2a Specification Type\uff0c\u4e5f\u5c31\u662f \u201c\u53ea\u5b58\u5728\u4e8e\u89c4\u8303\u91cc\u7684\u62bd\u8c61\u7c7b\u578b\u201d\u3002\u5b83\u4eec\u662f\u4e3a\u4e86\u66f4\u597d\u5730\u63cf\u8ff0\u8bed\u8a00\u7684\u5e95\u5c42\u884c\u4e3a\u903b\u8f91\u624d\u5b58\u5728\u7684\uff0c\u4f46\u5e76\u4e0d\u5b58\u5728\u4e8e\u5b9e\u9645\u7684 js \u4ee3\u7801\u4e2d\u3002<\/p>\n<\/blockquote>\n<p dir=\"auto\">\u518d\u770b\u63a5\u4e0b\u6765\u7684\u8fd9\u6bb5\u5177\u4f53\u4ecb\u7ecd Reference \u7684\u5185\u5bb9\uff1a<\/p>\n<blockquote>\n<p dir=\"auto\">A Reference is a resolved name binding.<\/p>\n<\/blockquote>\n<blockquote>\n<p dir=\"auto\">A Reference consists of three components, the base value, the referenced name and the Boolean valued strict reference flag.<\/p>\n<\/blockquote>\n<blockquote>\n<p dir=\"auto\">The base value is either undefined, an Object, a Boolean, a String, a Number, or an environment record (10.2.1).<\/p>\n<\/blockquote>\n<blockquote>\n<p dir=\"auto\">A base value of undefined indicates that the reference could not be resolved to a binding. The referenced name is a String.<\/p>\n<\/blockquote>\n<p dir=\"auto\">\u8fd9\u6bb5\u8bb2\u8ff0\u4e86 Reference \u7684\u6784\u6210\uff0c\u7531\u4e09\u4e2a\u7ec4\u6210\u90e8\u5206\uff0c\u5206\u522b\u662f\uff1a<\/p>\n<ul dir=\"auto\">\n<li>base value<\/li>\n<li>referenced name<\/li>\n<li>strict reference<\/li>\n<\/ul>\n<p dir=\"auto\">\u53ef\u662f\u8fd9\u4e9b\u5230\u5e95\u662f\u4ec0\u4e48\u5462\uff1f<\/p>\n<p dir=\"auto\">\u6211\u4eec\u7b80\u5355\u7684\u7406\u89e3\u7684\u8bdd\uff1a<\/p>\n<p dir=\"auto\">base value \u5c31\u662f\u5c5e\u6027\u6240\u5728\u7684\u5bf9\u8c61\u6216\u8005\u5c31\u662f EnvironmentRecord\uff0c\u5b83\u7684\u503c\u53ea\u53ef\u80fd\u662f undefined, an Object, a Boolean, a String, a Number, or an environment record \u5176\u4e2d\u7684\u4e00\u79cd\u3002<\/p>\n<p dir=\"auto\">referenced name \u5c31\u662f\u5c5e\u6027\u7684\u540d\u79f0\u3002<\/p>\n<p dir=\"auto\">\u4e3e\u4e2a\u4f8b\u5b50\uff1a<\/p>\n<div class=\"highlight highlight-source-js notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"var foo = 1;\n\n\/\/ \u5bf9\u5e94\u7684Reference\u662f\uff1a\nvar fooReference = {\n    base: EnvironmentRecord,\n    name: 'foo',\n    strict: false\n};\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">var<\/span> <span class=\"pl-s1\">foo<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-c1\">1<\/span><span class=\"pl-kos\">;<\/span>\n\n<span class=\"pl-c\">\/\/ \u5bf9\u5e94\u7684Reference\u662f\uff1a<\/span>\n<span class=\"pl-k\">var<\/span> <span class=\"pl-s1\">fooReference<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-c1\">base<\/span>: <span class=\"pl-v\">EnvironmentRecord<\/span><span class=\"pl-kos\">,<\/span>\n    <span class=\"pl-c1\">name<\/span>: <span class=\"pl-s\">'foo'<\/span><span class=\"pl-kos\">,<\/span>\n    <span class=\"pl-c1\">strict<\/span>: <span class=\"pl-c1\">false<\/span>\n<span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">;<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u518d\u4e3e\u4e2a\u4f8b\u5b50\uff1a<\/p>\n<div class=\"highlight highlight-source-js notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"var foo = {\n    bar: function () {\n        return this;\n    }\n};\n \nfoo.bar(); \/\/ foo\n\n\/\/ bar\u5bf9\u5e94\u7684Reference\u662f\uff1a\nvar BarReference = {\n    base: foo,\n    propertyName: 'bar',\n    strict: false\n};\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">var<\/span> <span class=\"pl-s1\">foo<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-en\">bar<\/span>: <span class=\"pl-k\">function<\/span> <span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n        <span class=\"pl-k\">return<\/span> <span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">;<\/span>\n    <span class=\"pl-kos\">}<\/span>\n<span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">;<\/span>\n \n<span class=\"pl-s1\">foo<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">bar<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span> <span class=\"pl-c\">\/\/ foo<\/span>\n\n<span class=\"pl-c\">\/\/ bar\u5bf9\u5e94\u7684Reference\u662f\uff1a<\/span>\n<span class=\"pl-k\">var<\/span> <span class=\"pl-v\">BarReference<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-c1\">base<\/span>: <span class=\"pl-s1\">foo<\/span><span class=\"pl-kos\">,<\/span>\n    <span class=\"pl-c1\">propertyName<\/span>: <span class=\"pl-s\">'bar'<\/span><span class=\"pl-kos\">,<\/span>\n    <span class=\"pl-c1\">strict<\/span>: <span class=\"pl-c1\">false<\/span>\n<span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">;<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u800c\u4e14\u89c4\u8303\u4e2d\u8fd8\u63d0\u4f9b\u4e86\u83b7\u53d6 Reference \u7ec4\u6210\u90e8\u5206\u7684\u65b9\u6cd5\uff0c\u6bd4\u5982 GetBase \u548c IsPropertyReference\u3002<\/p>\n<p dir=\"auto\">\u8fd9\u4e24\u4e2a\u65b9\u6cd5\u5f88\u7b80\u5355\uff0c\u7b80\u5355\u770b\u4e00\u770b\uff1a<\/p>\n<p dir=\"auto\">1.GetBase<\/p>\n<blockquote>\n<p dir=\"auto\">GetBase(V). Returns the base value component of the reference V.<\/p>\n<\/blockquote>\n<p dir=\"auto\">\u8fd4\u56de reference \u7684 base value\u3002<\/p>\n<p dir=\"auto\">2.IsPropertyReference<\/p>\n<blockquote>\n<p dir=\"auto\">IsPropertyReference(V). Returns true if either the base value is an object or HasPrimitiveBase(V) is true; otherwise returns false.<\/p>\n<\/blockquote>\n<p dir=\"auto\">\u7b80\u5355\u7684\u7406\u89e3\uff1a\u5982\u679c base value \u662f\u4e00\u4e2a\u5bf9\u8c61\uff0c\u5c31\u8fd4\u56detrue\u3002<\/p>\n<h2 dir=\"auto\">GetValue<\/h2>\n<p dir=\"auto\">\u9664\u6b64\u4e4b\u5916\uff0c\u7d27\u63a5\u7740\u5728 8.7.1 \u7ae0\u89c4\u8303\u4e2d\u5c31\u8bb2\u4e86\u4e00\u4e2a\u7528\u4e8e\u4ece Reference \u7c7b\u578b\u83b7\u53d6\u5bf9\u5e94\u503c\u7684\u65b9\u6cd5\uff1a GetValue\u3002<\/p>\n<p dir=\"auto\">\u7b80\u5355\u6a21\u62df GetValue \u7684\u4f7f\u7528\uff1a<\/p>\n<div class=\"highlight highlight-source-js notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"var foo = 1;\n\nvar fooReference = {\n    base: EnvironmentRecord,\n    name: 'foo',\n    strict: false\n};\n\nGetValue(fooReference) \/\/ 1;\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">var<\/span> <span class=\"pl-s1\">foo<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-c1\">1<\/span><span class=\"pl-kos\">;<\/span>\n\n<span class=\"pl-k\">var<\/span> <span class=\"pl-s1\">fooReference<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-c1\">base<\/span>: <span class=\"pl-v\">EnvironmentRecord<\/span><span class=\"pl-kos\">,<\/span>\n    <span class=\"pl-c1\">name<\/span>: <span class=\"pl-s\">'foo'<\/span><span class=\"pl-kos\">,<\/span>\n    <span class=\"pl-c1\">strict<\/span>: <span class=\"pl-c1\">false<\/span>\n<span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">;<\/span>\n\n<span class=\"pl-v\">GetValue<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">fooReference<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-c\">\/\/ 1;<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">GetValue \u8fd4\u56de\u5bf9\u8c61\u5c5e\u6027\u771f\u6b63\u7684\u503c\uff0c\u4f46\u662f\u8981\u6ce8\u610f\uff1a<\/p>\n<p dir=\"auto\"><strong>\u8c03\u7528 GetValue\uff0c\u8fd4\u56de\u7684\u5c06\u662f\u5177\u4f53\u7684\u503c\uff0c\u800c\u4e0d\u518d\u662f\u4e00\u4e2a Reference<\/strong><\/p>\n<p dir=\"auto\">\u8fd9\u4e2a\u5f88\u91cd\u8981\uff0c\u8fd9\u4e2a\u5f88\u91cd\u8981\uff0c\u8fd9\u4e2a\u5f88\u91cd\u8981\u3002<\/p>\n<h2 dir=\"auto\">\u5982\u4f55\u786e\u5b9athis\u7684\u503c<\/h2>\n<p dir=\"auto\">\u5173\u4e8e Reference \u8bb2\u4e86\u90a3\u4e48\u591a\uff0c\u4e3a\u4ec0\u4e48\u8981\u8bb2 Reference \u5462\uff1f\u5230\u5e95 Reference \u8ddf\u672c\u6587\u7684\u4e3b\u9898 this \u6709\u54ea\u4e9b\u5173\u8054\u5462\uff1f\u5982\u679c\u4f60\u80fd\u8010\u5fc3\u770b\u5b8c\u4e4b\u524d\u7684\u5185\u5bb9\uff0c\u4ee5\u4e0b\u5f00\u59cb\u8fdb\u5165\u9ad8\u80fd\u9636\u6bb5\uff1a<\/p>\n<p dir=\"auto\">\u770b\u89c4\u8303 11.2.3 Function Calls\uff1a<\/p>\n<p dir=\"auto\">\u8fd9\u91cc\u8bb2\u4e86\u5f53\u51fd\u6570\u8c03\u7528\u7684\u65f6\u5019\uff0c\u5982\u4f55\u786e\u5b9a this \u7684\u53d6\u503c\u3002<\/p>\n<p dir=\"auto\">\u53ea\u770b\u7b2c\u4e00\u6b65\u3001\u7b2c\u516d\u6b65\u3001\u7b2c\u4e03\u6b65\uff1a<\/p>\n<blockquote>\n<p dir=\"auto\">1.Let <em>ref<\/em> be the result of evaluating MemberExpression.<\/p>\n<\/blockquote>\n<blockquote>\n<p dir=\"auto\">6.If Type(<em>ref<\/em>) is Reference, then<\/p>\n<\/blockquote>\n<blockquote>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"  a.If IsPropertyReference(ref) is true, then\">\n<pre class=\"notranslate\"><code class=\"notranslate\">  a.If IsPropertyReference(ref) is true, then\n<\/code><\/pre>\n<\/div>\n<\/blockquote>\n<blockquote>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"      i.Let thisValue be GetBase(ref).\">\n<pre class=\"notranslate\"><code class=\"notranslate\">      i.Let thisValue be GetBase(ref).\n<\/code><\/pre>\n<\/div>\n<\/blockquote>\n<blockquote>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"  b.Else, the base of ref is an Environment Record\">\n<pre class=\"notranslate\"><code class=\"notranslate\">  b.Else, the base of ref is an Environment Record\n<\/code><\/pre>\n<\/div>\n<\/blockquote>\n<blockquote>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"      i.Let thisValue be the result of calling the ImplicitThisValue concrete method of GetBase(ref).\">\n<pre class=\"notranslate\"><code class=\"notranslate\">      i.Let thisValue be the result of calling the ImplicitThisValue concrete method of GetBase(ref).\n<\/code><\/pre>\n<\/div>\n<p dir=\"auto\">7.Else, Type(<em>ref<\/em>) is not Reference.<\/p>\n<\/blockquote>\n<blockquote>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"  a. Let thisValue be undefined.\">\n<pre class=\"notranslate\"><code class=\"notranslate\">  a. Let thisValue be undefined.\n<\/code><\/pre>\n<\/div>\n<\/blockquote>\n<p dir=\"auto\">\u8ba9\u6211\u4eec\u63cf\u8ff0\u4e00\u4e0b\uff1a<\/p>\n<p dir=\"auto\">1.\u8ba1\u7b97 MemberExpression \u7684\u7ed3\u679c\u8d4b\u503c\u7ed9 ref<\/p>\n<p dir=\"auto\">2.\u5224\u65ad ref \u662f\u4e0d\u662f\u4e00\u4e2a Reference \u7c7b\u578b<\/p>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"2.1 \u5982\u679c ref \u662f Reference\uff0c\u5e76\u4e14 IsPropertyReference(ref) \u662f true, \u90a3\u4e48 this \u7684\u503c\u4e3a GetBase(ref)\n\n2.2 \u5982\u679c ref \u662f Reference\uff0c\u5e76\u4e14 base value \u503c\u662f Environment Record, \u90a3\u4e48this\u7684\u503c\u4e3a ImplicitThisValue(ref)\n\n2.3 \u5982\u679c ref \u4e0d\u662f Reference\uff0c\u90a3\u4e48 this \u7684\u503c\u4e3a undefined\"><\/p>\n<pre class=\"notranslate\"><code class=\"notranslate\">2.1 \u5982\u679c ref \u662f Reference\uff0c\u5e76\u4e14 IsPropertyReference(ref) \u662f true, \u90a3\u4e48 this \u7684\u503c\u4e3a GetBase(ref)\n\n2.2 \u5982\u679c ref \u662f Reference\uff0c\u5e76\u4e14 base value \u503c\u662f Environment Record, \u90a3\u4e48this\u7684\u503c\u4e3a ImplicitThisValue(ref)\n\n2.3 \u5982\u679c ref \u4e0d\u662f Reference\uff0c\u90a3\u4e48 this \u7684\u503c\u4e3a undefined\n<\/code><\/pre>\n<\/div>\n<h2 dir=\"auto\">\u5177\u4f53\u5206\u6790<\/h2>\n<p dir=\"auto\">\u8ba9\u6211\u4eec\u4e00\u6b65\u4e00\u6b65\u770b\uff1a<\/p>\n<ol dir=\"auto\">\n<li>\u8ba1\u7b97 MemberExpression \u7684\u7ed3\u679c\u8d4b\u503c\u7ed9 ref<\/li>\n<\/ol>\n<p dir=\"auto\">\u4ec0\u4e48\u662f MemberExpression\uff1f\u770b\u89c4\u8303 11.2 Left-Hand-Side Expressions\uff1a<\/p>\n<p dir=\"auto\">MemberExpression :<\/p>\n<ul dir=\"auto\">\n<li>PrimaryExpression \/\/ \u539f\u59cb\u8868\u8fbe\u5f0f \u53ef\u4ee5\u53c2\u89c1\u300aJavaScript\u6743\u5a01\u6307\u5357\u7b2c\u56db\u7ae0\u300b<\/li>\n<li>FunctionExpression    \/\/ \u51fd\u6570\u5b9a\u4e49\u8868\u8fbe\u5f0f<\/li>\n<li>MemberExpression [ Expression ] \/\/ \u5c5e\u6027\u8bbf\u95ee\u8868\u8fbe\u5f0f<\/li>\n<li>MemberExpression . IdentifierName \/\/ \u5c5e\u6027\u8bbf\u95ee\u8868\u8fbe\u5f0f<\/li>\n<li>new MemberExpression Arguments    \/\/ \u5bf9\u8c61\u521b\u5efa\u8868\u8fbe\u5f0f<\/li>\n<\/ul>\n<p dir=\"auto\">\u4e3e\u4e2a\u4f8b\u5b50\uff1a<\/p>\n<div class=\"highlight highlight-source-js notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"function foo() {\n    console.log(this)\n}\n\nfoo(); \/\/ MemberExpression \u662f foo\n\nfunction foo() {\n    return function() {\n        console.log(this)\n    }\n}\n\nfoo()(); \/\/ MemberExpression \u662f foo()\n\nvar foo = {\n    bar: function () {\n        return this;\n    }\n}\n\nfoo.bar(); \/\/ MemberExpression \u662f foo.bar\n\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">function<\/span> <span class=\"pl-en\">foo<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-smi\">console<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">log<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">)<\/span>\n<span class=\"pl-kos\">}<\/span>\n\n<span class=\"pl-en\">foo<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span> <span class=\"pl-c\">\/\/ MemberExpression \u662f foo<\/span>\n\n<span class=\"pl-k\">function<\/span> <span class=\"pl-en\">foo<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-k\">return<\/span> <span class=\"pl-k\">function<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n        <span class=\"pl-smi\">console<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">log<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">)<\/span>\n    <span class=\"pl-kos\">}<\/span>\n<span class=\"pl-kos\">}<\/span>\n\n<span class=\"pl-en\">foo<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span> <span class=\"pl-c\">\/\/ MemberExpression \u662f foo()<\/span>\n\n<span class=\"pl-k\">var<\/span> <span class=\"pl-s1\">foo<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-en\">bar<\/span>: <span class=\"pl-k\">function<\/span> <span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n        <span class=\"pl-k\">return<\/span> <span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">;<\/span>\n    <span class=\"pl-kos\">}<\/span>\n<span class=\"pl-kos\">}<\/span>\n\n<span class=\"pl-s1\">foo<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">bar<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span> <span class=\"pl-c\">\/\/ MemberExpression \u662f foo.bar<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u6240\u4ee5\u7b80\u5355\u7406\u89e3 MemberExpression \u5176\u5b9e\u5c31\u662f()\u5de6\u8fb9\u7684\u90e8\u5206\u3002<\/p>\n<p dir=\"auto\">2.\u5224\u65ad ref \u662f\u4e0d\u662f\u4e00\u4e2a Reference \u7c7b\u578b\u3002<\/p>\n<p dir=\"auto\">\u5173\u952e\u5c31\u5728\u4e8e\u770b\u89c4\u8303\u662f\u5982\u4f55\u5904\u7406\u5404\u79cd MemberExpression\uff0c\u8fd4\u56de\u7684\u7ed3\u679c\u662f\u4e0d\u662f\u4e00\u4e2aReference\u7c7b\u578b\u3002<\/p>\n<p dir=\"auto\">\u4e3e\u6700\u540e\u4e00\u4e2a\u4f8b\u5b50\uff1a<\/p>\n<div class=\"highlight highlight-source-js notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"var value = 1;\n\nvar foo = {\n  value: 2,\n  bar: function () {\n    return this.value;\n  }\n}\n\n\/\/\u793a\u4f8b1\nconsole.log(foo.bar());\n\/\/\u793a\u4f8b2\nconsole.log((foo.bar)());\n\/\/\u793a\u4f8b3\nconsole.log((foo.bar = foo.bar)());\n\/\/\u793a\u4f8b4\nconsole.log((false || foo.bar)());\n\/\/\u793a\u4f8b5\nconsole.log((foo.bar, foo.bar)());\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">var<\/span> <span class=\"pl-s1\">value<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-c1\">1<\/span><span class=\"pl-kos\">;<\/span>\n\n<span class=\"pl-k\">var<\/span> <span class=\"pl-s1\">foo<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-c1\">value<\/span>: <span class=\"pl-c1\">2<\/span><span class=\"pl-kos\">,<\/span>\n  <span class=\"pl-en\">bar<\/span>: <span class=\"pl-k\">function<\/span> <span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-k\">return<\/span> <span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">value<\/span><span class=\"pl-kos\">;<\/span>\n  <span class=\"pl-kos\">}<\/span>\n<span class=\"pl-kos\">}<\/span>\n\n<span class=\"pl-c\">\/\/\u793a\u4f8b1<\/span>\n<span class=\"pl-smi\">console<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">log<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">foo<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">bar<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-c\">\/\/\u793a\u4f8b2<\/span>\n<span class=\"pl-smi\">console<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">log<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">foo<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">bar<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-c\">\/\/\u793a\u4f8b3<\/span>\n<span class=\"pl-smi\">console<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">log<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">foo<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">bar<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s1\">foo<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">bar<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-c\">\/\/\u793a\u4f8b4<\/span>\n<span class=\"pl-smi\">console<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">log<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-c1\">false<\/span> <span class=\"pl-c1\">||<\/span> <span class=\"pl-s1\">foo<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">bar<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-c\">\/\/\u793a\u4f8b5<\/span>\n<span class=\"pl-smi\">console<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">log<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">foo<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">bar<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">foo<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">bar<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span><\/pre>\n<\/div>\n<h3 dir=\"auto\">foo.bar()<\/h3>\n<p dir=\"auto\">\u5728\u793a\u4f8b 1 \u4e2d\uff0cMemberExpression \u8ba1\u7b97\u7684\u7ed3\u679c\u662f foo.bar\uff0c\u90a3\u4e48 foo.bar \u662f\u4e0d\u662f\u4e00\u4e2a Reference \u5462\uff1f<\/p>\n<p dir=\"auto\">\u67e5\u770b\u89c4\u8303 11.2.1 Property Accessors\uff0c\u8fd9\u91cc\u5c55\u793a\u4e86\u4e00\u4e2a\u8ba1\u7b97\u7684\u8fc7\u7a0b\uff0c\u4ec0\u4e48\u90fd\u4e0d\u7ba1\u4e86\uff0c\u5c31\u770b\u6700\u540e\u4e00\u6b65\uff1a<\/p>\n<blockquote>\n<p dir=\"auto\">Return a value of type Reference whose base value is baseValue and whose referenced name is propertyNameString, and whose strict mode flag is strict.<\/p>\n<\/blockquote>\n<p dir=\"auto\">\u6211\u4eec\u5f97\u77e5\u8be5\u8868\u8fbe\u5f0f\u8fd4\u56de\u4e86\u4e00\u4e2a Reference \u7c7b\u578b\uff01<\/p>\n<p dir=\"auto\">\u6839\u636e\u4e4b\u524d\u7684\u5185\u5bb9\uff0c\u6211\u4eec\u77e5\u9053\u8be5\u503c\u4e3a\uff1a<\/p>\n<div class=\"highlight highlight-source-js notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"var Reference = {\n  base: foo,\n  name: 'bar',\n  strict: false\n};\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">var<\/span> <span class=\"pl-v\">Reference<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-c1\">base<\/span>: <span class=\"pl-s1\">foo<\/span><span class=\"pl-kos\">,<\/span>\n  <span class=\"pl-c1\">name<\/span>: <span class=\"pl-s\">'bar'<\/span><span class=\"pl-kos\">,<\/span>\n  <span class=\"pl-c1\">strict<\/span>: <span class=\"pl-c1\">false<\/span>\n<span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">;<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u63a5\u4e0b\u6765\u6309\u7167 2.1 \u7684\u5224\u65ad\u6d41\u7a0b\u8d70\uff1a<\/p>\n<blockquote>\n<p dir=\"auto\">2.1 \u5982\u679c ref \u662f Reference\uff0c\u5e76\u4e14 IsPropertyReference(ref) \u662f true, \u90a3\u4e48 this \u7684\u503c\u4e3a GetBase(ref)<\/p>\n<\/blockquote>\n<p dir=\"auto\">\u8be5\u503c\u662f Reference \u7c7b\u578b\uff0c\u90a3\u4e48 IsPropertyReference(ref) \u7684\u7ed3\u679c\u662f\u591a\u5c11\u5462\uff1f<\/p>\n<p dir=\"auto\">\u524d\u9762\u6211\u4eec\u5df2\u7ecf\u94fa\u57ab\u4e86 IsPropertyReference \u65b9\u6cd5\uff0c\u5982\u679c base value \u662f\u4e00\u4e2a\u5bf9\u8c61\uff0c\u7ed3\u679c\u8fd4\u56de true\u3002<\/p>\n<p dir=\"auto\">base value \u4e3a foo\uff0c\u662f\u4e00\u4e2a\u5bf9\u8c61\uff0c\u6240\u4ee5 IsPropertyReference(ref) \u7ed3\u679c\u4e3a true\u3002<\/p>\n<p dir=\"auto\">\u8fd9\u4e2a\u65f6\u5019\u6211\u4eec\u5c31\u53ef\u4ee5\u786e\u5b9a this \u7684\u503c\u4e86\uff1a<\/p>\n<div class=\"highlight highlight-source-js notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"this = GetBase(ref)\uff0c\">\n<pre class=\"notranslate\"><span class=\"pl-smi\">this<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-v\">GetBase<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">ref<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-s1\">\uff0c<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">GetBase \u4e5f\u5df2\u7ecf\u94fa\u57ab\u4e86\uff0c\u83b7\u5f97 base value \u503c\uff0c\u8fd9\u4e2a\u4f8b\u5b50\u4e2d\u5c31\u662ffoo\uff0c\u6240\u4ee5 this \u7684\u503c\u5c31\u662f foo \uff0c\u793a\u4f8b1\u7684\u7ed3\u679c\u5c31\u662f 2\uff01<\/p>\n<p dir=\"auto\">\u5509\u5440\u5988\u5440\uff0c\u4e3a\u4e86\u8bc1\u660e this \u6307\u5411foo\uff0c\u771f\u662f\u7d2f\u6b7b\u6211\u4e86\uff01\u4f46\u662f\u77e5\u9053\u4e86\u539f\u7406\uff0c\u5269\u4e0b\u7684\u5c31\u66f4\u5feb\u4e86\u3002<\/p>\n<h3 dir=\"auto\">(foo.bar)()<\/h3>\n<p dir=\"auto\">\u770b\u793a\u4f8b2\uff1a<\/p>\n<div class=\"highlight highlight-source-js notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"console.log((foo.bar)());\">\n<pre class=\"notranslate\"><span class=\"pl-smi\">console<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">log<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">foo<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">bar<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">foo.bar \u88ab () \u5305\u4f4f\uff0c\u67e5\u770b\u89c4\u8303 11.1.6 The Grouping Operator<\/p>\n<p dir=\"auto\">\u76f4\u63a5\u770b\u7ed3\u679c\u90e8\u5206\uff1a<\/p>\n<blockquote>\n<p dir=\"auto\">Return the result of evaluating Expression. This may be of type Reference.<\/p>\n<\/blockquote>\n<blockquote>\n<p dir=\"auto\">NOTE This algorithm does not apply GetValue to the result of evaluating Expression.<\/p>\n<\/blockquote>\n<p dir=\"auto\">\u5b9e\u9645\u4e0a () \u5e76\u6ca1\u6709\u5bf9 MemberExpression \u8fdb\u884c\u8ba1\u7b97\uff0c\u6240\u4ee5\u5176\u5b9e\u8ddf\u793a\u4f8b 1 \u7684\u7ed3\u679c\u662f\u4e00\u6837\u7684\u3002<\/p>\n<h3 dir=\"auto\">(foo.bar = foo.bar)()<\/h3>\n<p dir=\"auto\">\u770b\u793a\u4f8b3\uff0c\u6709\u8d4b\u503c\u64cd\u4f5c\u7b26\uff0c\u67e5\u770b\u89c4\u8303 11.13.1 Simple Assignment ( = ):<\/p>\n<p dir=\"auto\">\u8ba1\u7b97\u7684\u7b2c\u4e09\u6b65\uff1a<\/p>\n<blockquote>\n<p dir=\"auto\">3.Let rval be GetValue(rref).<\/p>\n<\/blockquote>\n<p dir=\"auto\">\u56e0\u4e3a\u4f7f\u7528\u4e86 GetValue\uff0c\u6240\u4ee5\u8fd4\u56de\u7684\u503c\u4e0d\u662f Reference \u7c7b\u578b\uff0c<\/p>\n<p dir=\"auto\">\u6309\u7167\u4e4b\u524d\u8bb2\u7684\u5224\u65ad\u903b\u8f91\uff1a<\/p>\n<blockquote>\n<p dir=\"auto\">2.3 \u5982\u679c ref \u4e0d\u662fReference\uff0c\u90a3\u4e48 this \u7684\u503c\u4e3a undefined<\/p>\n<\/blockquote>\n<p dir=\"auto\">this \u4e3a undefined\uff0c\u975e\u4e25\u683c\u6a21\u5f0f\u4e0b\uff0cthis \u7684\u503c\u4e3a undefined \u7684\u65f6\u5019\uff0c\u5176\u503c\u4f1a\u88ab\u9690\u5f0f\u8f6c\u6362\u4e3a\u5168\u5c40\u5bf9\u8c61\u3002<\/p>\n<h3 dir=\"auto\">(false || foo.bar)()<\/h3>\n<p dir=\"auto\">\u770b\u793a\u4f8b4\uff0c\u903b\u8f91\u4e0e\u7b97\u6cd5\uff0c\u67e5\u770b\u89c4\u8303 11.11 Binary Logical Operators\uff1a<\/p>\n<p dir=\"auto\">\u8ba1\u7b97\u7b2c\u4e8c\u6b65\uff1a<\/p>\n<blockquote>\n<p dir=\"auto\">2.Let lval be GetValue(lref).<\/p>\n<\/blockquote>\n<p dir=\"auto\">\u56e0\u4e3a\u4f7f\u7528\u4e86 GetValue\uff0c\u6240\u4ee5\u8fd4\u56de\u7684\u4e0d\u662f Reference \u7c7b\u578b\uff0cthis \u4e3a undefined<\/p>\n<h3 dir=\"auto\">(foo.bar, foo.bar)()<\/h3>\n<p dir=\"auto\">\u770b\u793a\u4f8b5\uff0c\u9017\u53f7\u64cd\u4f5c\u7b26\uff0c\u67e5\u770b\u89c4\u830311.14 Comma Operator ( , )<\/p>\n<p dir=\"auto\">\u8ba1\u7b97\u7b2c\u4e8c\u6b65\uff1a<\/p>\n<blockquote>\n<p dir=\"auto\">2.Call GetValue(lref).<\/p>\n<\/blockquote>\n<p dir=\"auto\">\u56e0\u4e3a\u4f7f\u7528\u4e86 GetValue\uff0c\u6240\u4ee5\u8fd4\u56de\u7684\u4e0d\u662f Reference \u7c7b\u578b\uff0cthis \u4e3a undefined<\/p>\n<h3 dir=\"auto\">\u63ed\u6653\u7ed3\u679c<\/h3>\n<p dir=\"auto\">\u6240\u4ee5\u6700\u540e\u4e00\u4e2a\u4f8b\u5b50\u7684\u7ed3\u679c\u662f\uff1a<\/p>\n<div class=\"highlight highlight-source-js notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"\nvar value = 1;\n\nvar foo = {\n  value: 2,\n  bar: function () {\n    return this.value;\n  }\n}\n\n\/\/\u793a\u4f8b1\nconsole.log(foo.bar()); \/\/ 2\n\/\/\u793a\u4f8b2\nconsole.log((foo.bar)()); \/\/ 2\n\/\/\u793a\u4f8b3\nconsole.log((foo.bar = foo.bar)()); \/\/ 1\n\/\/\u793a\u4f8b4\nconsole.log((false || foo.bar)()); \/\/ 1\n\/\/\u793a\u4f8b5\nconsole.log((foo.bar, foo.bar)()); \/\/ 1\n\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">var<\/span> <span class=\"pl-s1\">value<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-c1\">1<\/span><span class=\"pl-kos\">;<\/span>\n\n<span class=\"pl-k\">var<\/span> <span class=\"pl-s1\">foo<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-c1\">value<\/span>: <span class=\"pl-c1\">2<\/span><span class=\"pl-kos\">,<\/span>\n  <span class=\"pl-en\">bar<\/span>: <span class=\"pl-k\">function<\/span> <span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-k\">return<\/span> <span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">value<\/span><span class=\"pl-kos\">;<\/span>\n  <span class=\"pl-kos\">}<\/span>\n<span class=\"pl-kos\">}<\/span>\n\n<span class=\"pl-c\">\/\/\u793a\u4f8b1<\/span>\n<span class=\"pl-smi\">console<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">log<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">foo<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">bar<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span> <span class=\"pl-c\">\/\/ 2<\/span>\n<span class=\"pl-c\">\/\/\u793a\u4f8b2<\/span>\n<span class=\"pl-smi\">console<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">log<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">foo<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">bar<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span> <span class=\"pl-c\">\/\/ 2<\/span>\n<span class=\"pl-c\">\/\/\u793a\u4f8b3<\/span>\n<span class=\"pl-smi\">console<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">log<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">foo<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">bar<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s1\">foo<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">bar<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span> <span class=\"pl-c\">\/\/ 1<\/span>\n<span class=\"pl-c\">\/\/\u793a\u4f8b4<\/span>\n<span class=\"pl-smi\">console<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">log<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-c1\">false<\/span> <span class=\"pl-c1\">||<\/span> <span class=\"pl-s1\">foo<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">bar<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span> <span class=\"pl-c\">\/\/ 1<\/span>\n<span class=\"pl-c\">\/\/\u793a\u4f8b5<\/span>\n<span class=\"pl-smi\">console<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">log<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">foo<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">bar<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">foo<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">bar<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span> <span class=\"pl-c\">\/\/ 1<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u6ce8\u610f\uff1a\u4ee5\u4e0a\u662f\u5728\u975e\u4e25\u683c\u6a21\u5f0f\u4e0b\u7684\u7ed3\u679c\uff0c\u4e25\u683c\u6a21\u5f0f\u4e0b\u56e0\u4e3a this \u8fd4\u56de undefined\uff0c\u6240\u4ee5\u793a\u4f8b 3 \u4f1a\u62a5\u9519\u3002<\/p>\n<h3 dir=\"auto\">\u8865\u5145<\/h3>\n<p dir=\"auto\">\u6700\u6700\u540e\uff0c\u5fd8\u8bb0\u4e86\u4e00\u4e2a\u6700\u6700\u666e\u901a\u7684\u60c5\u51b5\uff1a<\/p>\n<div class=\"highlight highlight-source-js notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"function foo() {\n    console.log(this)\n}\n\nfoo(); \"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">function<\/span> <span class=\"pl-en\">foo<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-smi\">console<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">log<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">)<\/span>\n<span class=\"pl-kos\">}<\/span>\n\n<span class=\"pl-en\">foo<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span> <\/pre>\n<\/div>\n<p dir=\"auto\">MemberExpression \u662f foo\uff0c\u89e3\u6790\u6807\u8bc6\u7b26\uff0c\u67e5\u770b\u89c4\u8303 10.3.1 Identifier Resolution\uff0c\u4f1a\u8fd4\u56de\u4e00\u4e2a Reference \u7c7b\u578b\u7684\u503c\uff1a<\/p>\n<div class=\"highlight highlight-source-js notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"var fooReference = {\n    base: EnvironmentRecord,\n    name: 'foo',\n    strict: false\n};\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">var<\/span> <span class=\"pl-s1\">fooReference<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-c1\">base<\/span>: <span class=\"pl-v\">EnvironmentRecord<\/span><span class=\"pl-kos\">,<\/span>\n    <span class=\"pl-c1\">name<\/span>: <span class=\"pl-s\">'foo'<\/span><span class=\"pl-kos\">,<\/span>\n    <span class=\"pl-c1\">strict<\/span>: <span class=\"pl-c1\">false<\/span>\n<span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">;<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u63a5\u4e0b\u6765\u8fdb\u884c\u5224\u65ad\uff1a<\/p>\n<blockquote>\n<p dir=\"auto\">2.1 \u5982\u679c ref \u662f Reference\uff0c\u5e76\u4e14 IsPropertyReference(ref) \u662f true, \u90a3\u4e48 this \u7684\u503c\u4e3a GetBase(ref)<\/p>\n<\/blockquote>\n<p dir=\"auto\">\u56e0\u4e3a base value \u662f EnvironmentRecord\uff0c\u5e76\u4e0d\u662f\u4e00\u4e2a Object \u7c7b\u578b\uff0c\u8fd8\u8bb0\u5f97\u524d\u9762\u8bb2\u8fc7\u7684 base value \u7684\u53d6\u503c\u53ef\u80fd\u5417\uff1f \u53ea\u53ef\u80fd\u662f undefined, an Object, a Boolean, a String, a Number, \u548c an environment record \u4e2d\u7684\u4e00\u79cd\u3002<\/p>\n<p dir=\"auto\">IsPropertyReference(ref) \u7684\u7ed3\u679c\u4e3a false\uff0c\u8fdb\u5165\u4e0b\u4e2a\u5224\u65ad\uff1a<\/p>\n<blockquote>\n<p dir=\"auto\">2.2 \u5982\u679c ref \u662f Reference\uff0c\u5e76\u4e14 base value \u503c\u662f Environment Record, \u90a3\u4e48this\u7684\u503c\u4e3a ImplicitThisValue(ref)<\/p>\n<\/blockquote>\n<p dir=\"auto\">base value \u6b63\u662f Environment Record\uff0c\u6240\u4ee5\u4f1a\u8c03\u7528 ImplicitThisValue(ref)<\/p>\n<p dir=\"auto\">\u67e5\u770b\u89c4\u8303 10.2.1.1.6\uff0cImplicitThisValue \u65b9\u6cd5\u7684\u4ecb\u7ecd\uff1a\u8be5\u51fd\u6570\u59cb\u7ec8\u8fd4\u56de undefined\u3002<\/p>\n<p dir=\"auto\">\u6240\u4ee5\u6700\u540e this \u7684\u503c\u5c31\u662f undefined\u3002<\/p>\n<h2 dir=\"auto\">\u591a\u8bf4\u4e00\u53e5<\/h2>\n<p dir=\"auto\">\u5c3d\u7ba1\u6211\u4eec\u53ef\u4ee5\u7b80\u5355\u7684\u7406\u89e3 this \u4e3a\u8c03\u7528\u51fd\u6570\u7684\u5bf9\u8c61\uff0c\u5982\u679c\u662f\u8fd9\u6837\u7684\u8bdd\uff0c\u5982\u4f55\u89e3\u91ca\u4e0b\u9762\u8fd9\u4e2a\u4f8b\u5b50\u5462\uff1f<\/p>\n<div class=\"highlight highlight-source-js notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"var value = 1;\n\nvar foo = {\n  value: 2,\n  bar: function () {\n    return this.value;\n  }\n}\nconsole.log((false || foo.bar)()); \/\/ 1\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">var<\/span> <span class=\"pl-s1\">value<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-c1\">1<\/span><span class=\"pl-kos\">;<\/span>\n\n<span class=\"pl-k\">var<\/span> <span class=\"pl-s1\">foo<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-c1\">value<\/span>: <span class=\"pl-c1\">2<\/span><span class=\"pl-kos\">,<\/span>\n  <span class=\"pl-en\">bar<\/span>: <span class=\"pl-k\">function<\/span> <span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-k\">return<\/span> <span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">value<\/span><span class=\"pl-kos\">;<\/span>\n  <span class=\"pl-kos\">}<\/span>\n<span class=\"pl-kos\">}<\/span>\n<span class=\"pl-smi\">console<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">log<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-c1\">false<\/span> <span class=\"pl-c1\">||<\/span> <span class=\"pl-s1\">foo<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">bar<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span> <span class=\"pl-c\">\/\/ 1<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u6b64\u5916\uff0c\u53c8\u5982\u4f55\u786e\u5b9a\u8c03\u7528\u51fd\u6570\u7684\u5bf9\u8c61\u662f\u8c01\u5462\uff1f\u5728\u5199\u6587\u7ae0\u4e4b\u521d\uff0c\u6211\u5c31\u9762\u4e34\u7740\u8fd9\u4e9b\u95ee\u9898\uff0c\u6700\u540e\u8fd8\u662f\u653e\u5f03\u4ece\u591a\u4e2a\u60c5\u5f62\u4e0b\u7ed9\u5927\u5bb6\u8bb2\u89e3 this \u6307\u5411\u7684\u601d\u8def\uff0c\u800c\u662f\u8ffd\u6839\u6eaf\u6e90\u7684\u4ece ECMASciript \u89c4\u8303\u8bb2\u89e3 this \u7684\u6307\u5411\uff0c\u5c3d\u7ba1\u4ece\u8fd9\u4e2a\u89d2\u5ea6\u5199\u8d77\u6765\u548c\u8bfb\u8d77\u6765\u90fd\u6bd4\u8f83\u5403\u529b\uff0c\u4f46\u662f\u4e00\u65e6\u591a\u8bfb\u51e0\u904d\uff0c\u660e\u767d\u539f\u7406\uff0c\u7edd\u5bf9\u4f1a\u7ed9\u4f60\u4e00\u4e2a\u5168\u65b0\u7684\u89c6\u89d2\u770b\u5f85 this \u3002\u800c\u4f60\u4e5f\u5c31\u80fd\u660e\u767d\uff0c\u5c3d\u7ba1 foo() \u548c (foo.bar = foo.bar)() \u6700\u540e\u7ed3\u679c\u90fd\u6307\u5411\u4e86 undefined\uff0c\u4f46\u662f\u4e24\u8005\u4ece\u89c4\u8303\u7684\u89d2\u5ea6\u4e0a\u5374\u6709\u7740\u672c\u8d28\u7684\u533a\u522b\u3002<\/p>\n<p dir=\"auto\">\u6b64\u7bc7\u8bb2\u89e3\u6267\u884c\u4e0a\u4e0b\u6587\u7684 this\uff0c\u5373\u4fbf\u4e0d\u662f\u5f88\u7406\u89e3\u6b64\u7bc7\u7684\u5185\u5bb9\uff0c\u4f9d\u7136\u4e0d\u5f71\u54cd\u5927\u5bb6\u4e86\u89e3\u6267\u884c\u4e0a\u4e0b\u6587\u8fd9\u4e2a\u4e3b\u9898\u4e0b\u5176\u4ed6\u7684\u5185\u5bb9\u3002\u6240\u4ee5\uff0c\u4f9d\u7136\u53ef\u4ee5\u5b89\u5fc3\u7684\u770b\u4e0b\u4e00\u7bc7\u6587\u7ae0\u3002<\/p>\n<h2 dir=\"auto\">\u4e0b\u4e00\u7bc7\u6587\u7ae0<\/h2>\n<p dir=\"auto\"><a href=\"https:\/\/github.com\/mqyqingfeng\/Blog\/issues\/8\" data-hovercard-type=\"issue\" data-hovercard-url=\"\/mqyqingfeng\/Blog\/issues\/8\/hovercard\">\u300aJavaScript\u6df1\u5165\u4e4b\u6267\u884c\u4e0a\u4e0b\u6587\u300b<\/a><\/p>\n<h2 dir=\"auto\">\u6df1\u5165\u7cfb\u5217<\/h2>\n<p dir=\"auto\">JavaScript\u6df1\u5165\u7cfb\u5217\u76ee\u5f55\u5730\u5740\uff1a<a href=\"https:\/\/github.com\/mqyqingfeng\/Blog\">https:\/\/github.com\/mqyqingfeng\/Blog<\/a>\u3002<\/p>\n<p dir=\"auto\">JavaScript\u6df1\u5165\u7cfb\u5217\u9884\u8ba1\u5199\u5341\u4e94\u7bc7\u5de6\u53f3\uff0c\u65e8\u5728\u5e2e\u5927\u5bb6\u634b\u987aJavaScript\u5e95\u5c42\u77e5\u8bc6\uff0c\u91cd\u70b9\u8bb2\u89e3\u5982\u539f\u578b\u3001\u4f5c\u7528\u57df\u3001\u6267\u884c\u4e0a\u4e0b\u6587\u3001\u53d8\u91cf\u5bf9\u8c61\u3001this\u3001\u95ed\u5305\u3001\u6309\u503c\u4f20\u9012\u3001call\u3001apply\u3001bind\u3001new\u3001\u7ee7\u627f\u7b49\u96be\u70b9\u6982\u5ff5\u3002<\/p>\n<p dir=\"auto\">\u5982\u679c\u6709\u9519\u8bef\u6216\u8005\u4e0d\u4e25\u8c28\u7684\u5730\u65b9\uff0c\u8bf7\u52a1\u5fc5\u7ed9\u4e88\u6307\u6b63\uff0c\u5341\u5206\u611f\u8c22\u3002\u5982\u679c\u559c\u6b22\u6216\u8005\u6709\u6240\u542f\u53d1\uff0c\u6b22\u8fcestar\uff0c\u5bf9\u4f5c\u8005\u4e5f\u662f\u4e00\u79cd\u9f13\u52b1\u3002<\/p>\n<\/td>\n<p>\u6587\u7ae0\u8f6c\u8f7d\u81ea<a href='https:\/\/github.com\/mqyqingfeng\/Blog\/issues\/7'>https:\/\/github.com\/mqyqingfeng\/Blog\/issues\/7<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u524d\u8a00 \u5728\u300aJavaScript\u6df1\u5165\u4e4b\u6267\u884c\u4e0a\u4e0b\u6587\u6808\u300b\u4e2d\u8bb2\u5230\uff0c\u5f53JavaScript\u4ee3\u7801\u6267\u884c\u4e00\u6bb5\u53ef\u6267\u884c\u4ee3\u7801(executable code)\u65f6\uff0c\u4f1a\u521b\u5efa\u5bf9\u5e94\u7684\u6267\u884c\u4e0a\u4e0b&#8230;<\/p>\n<p class=\"read-more\"><a class=\"btn btn-default\" href=\"https:\/\/www.lccc.top\/?p=1387\"> Read More<span class=\"screen-reader-text\">  Read More<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-1387","post","type-post","status-publish","format-standard","hentry","category-learn"],"_links":{"self":[{"href":"https:\/\/www.lccc.top\/index.php?rest_route=\/wp\/v2\/posts\/1387"}],"collection":[{"href":"https:\/\/www.lccc.top\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.lccc.top\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.lccc.top\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lccc.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1387"}],"version-history":[{"count":1,"href":"https:\/\/www.lccc.top\/index.php?rest_route=\/wp\/v2\/posts\/1387\/revisions"}],"predecessor-version":[{"id":1494,"href":"https:\/\/www.lccc.top\/index.php?rest_route=\/wp\/v2\/posts\/1387\/revisions\/1494"}],"wp:attachment":[{"href":"https:\/\/www.lccc.top\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1387"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lccc.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1387"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lccc.top\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1387"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}