首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在JavaScript中,是否会有任何独立的内部函数将"this“视为调用原始方法的对象?

在JavaScript中,是否会有任何独立的内部函数将"this“视为调用原始方法的对象?
EN

Stack Overflow用户
提问于 2013-03-06 15:42:53
回答 3查看 1.1K关注 0票数 1

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

代码如下:

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

代码语言:javascript
复制
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、火狐和node.js应该在很大程度上实现ECMA-5,所以我在它们中尝试了上面的代码,它们仍然在func2func3中打印出全局对象。然后,我将"use strict";添加到func1中,以防万一,也添加到func2func3中。代码:http://jsfiddle.net/9GJhu/6/现在在Chrome和node.js中,this将打印为undefined,而不是myObject。因此,根据这本书,在ECMA-5中,this应该是myObject。上面的代码有什么问题?

EN

回答 3

Stack Overflow用户

发布于 2013-03-06 16:10:37

我可能错了,但我在规范中没有看到这本书所暗示的任何东西。

根据ECMAScript 5.1 specification 10.4.3输入功能代码

  1. 如果函数代码是严格代码,则将ThisBinding设置为thisArg。
  2. 否则,如果thisArg为null或未定义,则将ThisBinding设置为全局对象。
  3. 否则,如果类型(ThisArg)不是Object,将代码设置为ToObject(thisArg).
  4. Else将声明设置为ToObject(thisArg).
  5. Else。将F的[Scope]内部属性的值作为argument.
  6. Set传递给ThisBinding调用localEnv的结果。NewDeclarativeEnvironment to property.
  7. Perform VariableEnvironment是使用函数代码代码和argumentsList调用F的[代码]内部声明绑定实例化的值,如10.5中所述。

根据(1.),由于您的func2func3没有任何上下文,并且您指定了strict mode,因此您的上下文将被设置为undefined。在不使用strict mode的情况下,根据(2),this将设置为window

票数 2
EN

Stack Overflow用户

发布于 2013-03-06 16:11:34

当您使用'use strict‘指令时,'this’关键字默认情况下是'undefined‘,而非严格模式则是默认情况下'this’关键字是指全局对象。您需要显式指定上下文。

顺便说一句,你应该只需要声明“use strict”一次。

票数 1
EN

Stack Overflow用户

发布于 2013-03-06 16:34:46

这些函数是嵌套的,这并不意味着什么。它们继续以相同的方式工作,也不嵌套:

代码语言:javascript
复制
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/

代码语言:javascript
复制
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不允许通过它显式引用全局对象。

默认情况下,大多数浏览器不会应用ECMA-5,因为限制更多,因此不能追溯兼容。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15241647

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档