Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.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_Closures - Fatal编程技术网

Javascript 使用与最新实例相同的函数的多个对象实例

Javascript 使用与最新实例相同的函数的多个对象实例,javascript,closures,Javascript,Closures,我在为Javascript库创建函数时遇到了这个问题。据我所知,当一个对象的函数使用闭包和承诺的组合时,最新创建的版本将用于所有实例。以下代码的输出重复“3”三次。但是,当我在定义logSecret的行前面添加var时,输出结果是1 2 3,这是我最初期望的结果 为什么对象的多个实例最终使用相同的值 为什么在闭包前添加var可以解决问题 不幸的是,我对Javascript的了解还不够透彻,无法理解这里到底发生了什么,所以我希望有人能对这里发生的事情有所了解。谢谢大家! 函数MyObject(m

我在为Javascript库创建函数时遇到了这个问题。据我所知,当一个对象的函数使用闭包和承诺的组合时,最新创建的版本将用于所有实例。以下代码的输出重复“3”三次。但是,当我在定义
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
也是如此。变量应始终显式声明。确保始终使用严格模式,以免发生这些错误。