6

在Chrome Dev Console中测试了一些 js 代码,我有点困惑。

我知道在严格模式下,当引用这个关键字时,不是对象的方法的函数应该接收undefined而不是全局对象。

function test(){
    "use strict";
    return this===undefined;}
test(); 

输出false

"use strict";
function test(){
    return this===undefined;}
test(); 

还是的。

(function test(){
    "use strict";
    return this===undefined;}());

输出true

只是想澄清一下。ʕ •ᴥ•ʔ 我是 js 新手。

4

3 回答 3

3

您注意到的只是开发人员控制台工作方式的副作用。当您在此处输入代码时,实际上会发生这种情况(有关更多详细信息,请参阅此答案):

eval.call(null, "with (window) { \
                     function test() { \
                         'use strict'; \
                         console.log(this); \
                     } test(); \
                 }");

这是对 的间接调用eval,这意味着它将始终在全局执行上下文中执行(在浏览器中,即window)。

实际上,该函数绑定到全局对象,因此this持有对全局对象的引用,就像您在网页中(而不是在控制台中)执行此操作一样:

function test(){
    "use strict";
    return this === undefined;
}

test(); // true
test.call(window); // false
于 2013-02-28T12:38:40.933 回答
1

一切安好。如果您通过某个 HTML 页面(不是开发控制台)运行代码,结果会符合预期(总是this===undefined)。

此外在最新的 Firefox (Firebug) 中:

function test(){
    "use strict";
    return this===undefined;}
test(); 
>> true

所以这似乎只是另一个 Chrome 的错误(功能?)。感觉它对通过开发控制台传递的代码的方法略有不同。

另请注意,顺序很重要:

<script>
    console.log( 'Me First!' );

    "use strict";

    function test(){
        console.log( this );
    }
    test();

</script>

>>> "Me First!"
>>> Window {top: Window, window: Window, location: Location, external: Object, chrome: Object…}

但:

<script>
    "use strict";

    console.log( 'Me later!' );

    function test(){
        console.log( this );
    }
    test();

</script>

>>> undefined
>>> "Me later!"
于 2013-02-28T12:33:00.220 回答
1

这是 Chromium 开发人员控制台中的一个错误,导致this仍然引用全局对象。javascript:与在地址栏和文档中指定的代码相同。

您可以这样测试(2 个控制台输入):

var global = (function () { return this; }());

"use strict";
function test () { return this === global; }
test();

和(一个或多个控制台输入)

var script = document.createElement("script");
script.type = "text/javascript";
script.appendChild(document.createTextNode(
  'function test () { "use strict"; return this === undefined; }; console.log(test());'
));
document.body.appendChild(script);

在 Chromium 版本 25.0.1364.97 Debian 7.0 (183676) 中测试。

于 2013-02-28T12:39:54.090 回答