Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/479.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么将此函数附加到全局上下文_Javascript_This_Global_Method Invocation_Closure - Fatal编程技术网

Javascript 为什么将此函数附加到全局上下文

Javascript 为什么将此函数附加到全局上下文,javascript,this,global,method-invocation,closure,Javascript,This,Global,Method Invocation,Closure,当我使用var关键字声明任何变量时,它会在封闭范围内声明。然而,在下面的代码中,我已经用var关键字声明了函数c(在对象方法a.b中),并且仍然函数c中的该绑定到全局对象窗口。为什么会这样 var a = { b: function () { var c = function () { return this; }; return c(); } };

当我使用
var
关键字声明任何变量时,它会在封闭范围内声明。然而,在下面的代码中,我已经用
var
关键字声明了函数
c
(在对象方法
a.b
中),并且仍然
函数
c
中的该
绑定到全局对象
窗口。为什么会这样

var a = {
        b: function () {
            var c = function () {
                return this;
            };
            return c();
        }
    };

document.write(a.b());  //prints: [object Window]

的值由上下文而不是范围确定

当您在没有任何上下文(
context.func()
)的情况下调用函数时(
c()
),默认上下文是默认对象(在浏览器中是
窗口
),除非您处于严格模式(在这种情况下,它是
未定义的


(此规则也有例外,例如
apply
call
bind
、和
new
,但在这里它们都不适用)。

的值由上下文而不是范围决定

当您在没有任何上下文(
context.func()
)的情况下调用函数时(
c()
),默认上下文是默认对象(在浏览器中是
窗口
),除非您处于严格模式(在这种情况下,它是
未定义的


(这条规则也有例外,例如
apply
call
bind
,和
new
,但它们都不适用于此)。

许多人对此感到困惑。该值取决于4种调用方法之一。
但是,函数调用和调用会导致大部分混淆。
如果函数是对象的成员,则是对象本身

obj.someFunction()//方法调用
如果在没有上下文的情况下调用函数,则为全局对象(在“严格模式”中未定义)

当一个函数在一个对象中被调用,而不是像在一个object.testWithHelper(..)中那样作为对象的成员调用时,就会出现混淆

var testForThis=函数(isThis,消息){
//这可能令人困惑
如果(这个===是这个)
console.log(“这是”+消息);
其他的
console.log(“这不是”+消息);
};  
//函数调用
测试(本“全球”)//这是全球性的
变量对象={
test:testForThis,//我是一个方法
testWithHelper:函数(isThis,消息){
//函数调用
testForThis(isThis,message+“来自helper”);
}
};
//方法调用
一个对象测试(一个对象,“一个对象”)//这是一个对象
//方法调用,然后是函数调用
testWithHelper(anObject,“对象”)//这不是来自帮助程序的对象
这是我的

如果希望c返回a,可以使用:

或者一起避免这种情况:

var getNewA = function() {
    var newA = {};
    newA.b = function() {
        var c = function() {
            return newA;
        };
        return c();
    };    
    return newA;
};

var newA = getNewA();

许多人对这件事感到困惑。该值取决于4种调用方法之一。
但是,函数调用和调用会导致大部分混淆。
如果函数是对象的成员,则是对象本身

obj.someFunction()//方法调用
如果在没有上下文的情况下调用函数,则为全局对象(在“严格模式”中未定义)

当一个函数在一个对象中被调用,而不是像在一个object.testWithHelper(..)中那样作为对象的成员调用时,就会出现混淆

var testForThis=函数(isThis,消息){
//这可能令人困惑
如果(这个===是这个)
console.log(“这是”+消息);
其他的
console.log(“这不是”+消息);
};  
//函数调用
测试(本“全球”)//这是全球性的
变量对象={
test:testForThis,//我是一个方法
testWithHelper:函数(isThis,消息){
//函数调用
testForThis(isThis,message+“来自helper”);
}
};
//方法调用
一个对象测试(一个对象,“一个对象”)//这是一个对象
//方法调用,然后是函数调用
testWithHelper(anObject,“对象”)//这不是来自帮助程序的对象
这是我的

如果希望c返回a,可以使用:

或者一起避免这种情况:

var getNewA = function() {
    var newA = {};
    newA.b = function() {
        var c = function() {
            return newA;
        };
        return c();
    };    
    return newA;
};

var newA = getNewA();

值取决于调用的上下文,而不是包含函数的变量的范围。
值取决于调用的上下文,而不是包含函数的变量的范围。谢谢,我得到了它。我只是好奇为什么JSFIDLE打印的是
未定义的
而不是
全局的
,尽管浏览器中的相同功能正常,因为您将JSFIDLE配置为将其包装在函数中并将其用作onload处理程序:
window.onload=function(){var context=“global”
谢谢,我知道了。我很好奇为什么JSFIDLE打印的是
未定义的
而不是
全局的
,虽然在浏览器中同样可以正常工作,因为您将JS FIDLE配置为将其包装在函数中,并将其用作onload处理程序:
window.onload=function(){var context=“global”;
过于复杂的代码。可以简单地重写为:var a={b:function(){var c=function(){return this;};return c.call(this);};过于复杂的代码。可以简单地重写为:var a={b:function(){var c=function(){return this;};返回c.call(this);};
var getNewA = function() {
    var newA = {};
    newA.b = function() {
        var c = function() {
            return newA;
        };
        return c();
    };    
    return newA;
};

var newA = getNewA();