Javascript 使用与最新实例相同的函数的多个对象实例
我在为Javascript库创建函数时遇到了这个问题。据我所知,当一个对象的函数使用闭包和承诺的组合时,最新创建的版本将用于所有实例。以下代码的输出重复“3”三次。但是,当我在定义Javascript 使用与最新实例相同的函数的多个对象实例,javascript,closures,Javascript,Closures,我在为Javascript库创建函数时遇到了这个问题。据我所知,当一个对象的函数使用闭包和承诺的组合时,最新创建的版本将用于所有实例。以下代码的输出重复“3”三次。但是,当我在定义logSecret的行前面添加var时,输出结果是1 2 3,这是我最初期望的结果 为什么对象的多个实例最终使用相同的值 为什么在闭包前添加var可以解决问题 不幸的是,我对Javascript的了解还不够透彻,无法理解这里到底发生了什么,所以我希望有人能对这里发生的事情有所了解。谢谢大家! 函数MyObject(m
logSecret
的行前面添加var
时,输出结果是1 2 3,这是我最初期望的结果
为什么对象的多个实例最终使用相同的值
为什么在闭包前添加var
可以解决问题
不幸的是,我对Javascript的了解还不够透彻,无法理解这里到底发生了什么,所以我希望有人能对这里发生的事情有所了解。谢谢大家!
函数MyObject(myValue){
var_this=这个;
_this.secret=myValue;
_this.foo=函数(){
makePromise=函数(){
var promise=$.Deferred();
承诺。决议(“完成”);
回报承诺;
}
logSecret=函数(){
console.log(_this.secret);
}
var promise=makePromise();
$.when(promise).then(函数(数据){logSecret();});
}
}
var obj1=新的MyObject(1);
var obj2=新的MyObject(2);
var obj3=新的MyObject(3);
obj1.foo();
obj2.foo();
obj3.foo()代码>
在非严格模式下,当变量未使用var
、let
或const
显式声明时,将创建一个隐式全局变量。这些变量的行为就好像它们是在全局上下文中声明的一样
在代码中,变量makePromise
和logSecret
没有显式声明,因此每次调用MyObject
都会共享这些变量
因此,每次调用MyObject
时,makePromise
和logSecret
都会被一个新的函数对象实例覆盖,该实例将关闭词法环境,以便最新调用MyObject
MyObject
的最终调用结束于3
的秘密值,因此观察到的行为
函数MyObject(myValue){
var_this=这个;
_this.secret=myValue;
_this.foo=函数(){
makePromise=function(){//全局变量
var promise=$.Deferred();
承诺。决议(“完成”);
回报承诺;
}
logSecret=function(){//全局变量
console.log(_this.secret);
}
var promise=makePromise();
$.when(承诺)。then(函数(数据){
logSecret();
});
}
}
在非严格模式下,当变量未使用var
、let
或const
显式声明时,将创建一个隐式全局变量。这些变量的行为就好像它们是在全局上下文中声明的一样
在代码中,变量makePromise
和logSecret
没有显式声明,因此每次调用MyObject
都会共享这些变量
因此,每次调用MyObject
时,makePromise
和logSecret
都会被一个新的函数对象实例覆盖,该实例将关闭词法环境,以便最新调用MyObject
MyObject
的最终调用结束于3
的秘密值,因此观察到的行为
函数MyObject(myValue){
var_this=这个;
_this.secret=myValue;
_this.foo=函数(){
makePromise=function(){//全局变量
var promise=$.Deferred();
承诺。决议(“完成”);
回报承诺;
}
logSecret=function(){//全局变量
console.log(_this.secret);
}
var promise=makePromise();
$.when(承诺)。then(函数(数据){
logSecret();
});
}
}
没有var
,logSecret
是一个全局变量。makePromise
也是如此。应始终显式声明变量。确保始终使用严格模式,以免发生这些错误。如果没有var
,logSecret
,则是全局变量。makePromise
也是如此。变量应始终显式声明。确保始终使用严格模式,以免发生这些错误。