1

在《JavaScript 启蒙》一书中(链接指向预发布版本(第 85 页),但我有已发布版本(第 6.3 章),它说了同样的话),它说任何内部函数都将this视为全局对象( window) 在 ECMA-3 中,但将在 ECMA-5 中修复。

代码如下:

http://jsfiddle.net/javascriptenlightenment/9GJhu/

var myObject = {
    func1: function() {
        console.log(this); // logs myObject
        var func2 = function() {
            console.log(this) // logs window, and will do so from this point on
            var func3 = function() {
                console.log(this); // logs window, as it’s the head object
            }();
        }();
    }  
}

myObject.func1();

但我认为当前的 Chrome、Firefox 和 node.js 应该在很大程度上实现了 ECMA-5,所以我在它们中尝试了上面的代码,它们仍然打印出 and 中的全局func2对象func3。然后我添加"use strict";func1and 以防万一,还添加到func2and func3。代码: http: //jsfiddle.net/9GJhu/6/ 现在在 Chrome 和 node.js 中,this将打印为undefined,而不是myObject. 所以按照书上的,this应该是myObjectECMA-5。上面的代码有什么问题?

4

3 回答 3

2

我可能是错的,但我在规范中没有看到这本书的任何含义。
根据ECMAScript 5.1 规范10.4.3 输入功能代码

  1. 如果函数代码是严格代码,则将 ThisBinding 设置为 thisArg。
  2. 否则,如果 thisArg 为 null 或未定义,则将 ThisBinding 设置为全局对象。
  3. 否则,如果 Type(thisArg) 不是 Object,则将 ThisBinding 设置为 ToObject(thisArg)。
  4. 否则将 ThisBinding 设置为 thisArg。
  5. 让 localEnv 成为调用 NewDeclarativeEnvironment 的结果,并将 F 的 [[Scope]] 内部属性的值作为参数传递。
  6. 将 LexicalEnvironment 设置为 localEnv。
  7. 将变量环境设置为 localEnv。
  8. 令 code 为 F 的 [[Code]] 内部属性的值。
  9. 使用功能代码代码和argumentsList 执行声明绑定实例化,如10.5 中所述。

根据 (1.),由于您的func2andfunc3没有任何上下文,并且您指定strict mode您的上下文将设置为undefined. 没有strict mode并且根据 (2.)this将被设置为window

于 2013-03-06T08:10:37.193 回答
1

当你使用'use strict'指令时,'this'关键字默认是'undefined',而不是非严格模式,'this'关键字默认指向全局对象。您需要明确指定上下文。

附带说明一下,您应该只需要声明一次“使用严格”。

于 2013-03-06T08:11:33.547 回答
0

函数嵌套的事实并不意味着任何事情。他们继续以同样的方式工作,也没有嵌套:

var myObject = {
    func1: function() {
        console.log(this); // logs myObject
    }  
}
myObject.func1();

var func2 = function() {
    console.log(this) // logs window, and will do so from this point on
}();

var func3 = function() {
    console.log(this); // logs window, as it’s the head object
}();

http://jsfiddle.net/NYr3y/2/

var myObject = {
    func1: function() {
        "use strict";

        console.log(this); // logs myObject
    }  
}

myObject.func1();


var func2 = function() {
    "use strict";

    console.log(this) // logs window, and will do so from this point on

}();

var func3 = function() {
    "use strict";

    console.log(this); // logs window, as it’s the head object
}();

http://jsfiddle.net/4B84u/2/

第一个函数使用上下文(作为方法)调用,因此“this”是 myObject。

其他函数在没有上下文的情况下调用(就像func2()),在这种情况下,ECMA-5 不允许通过 this 显式引用全局对象。

大多数浏览器默认不应用 ECMA-5,因为限制性更强,因此不兼容。

于 2013-03-06T08:34:45.563 回答