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();