Javascript 执行作为变量给定的函数
我创建了以下对象:Javascript 执行作为变量给定的函数,javascript,function,variables,scope,this,Javascript,Function,Variables,Scope,This,我创建了以下对象: function Calculator() { //some code here, including object variables and functions, such as: this.add = function(x) { //again, irrelevant code } //similar methods } var calc = new Calculator(); 然后,我试着做以下几点: var me
function Calculator() {
//some code here, including object variables and functions, such as:
this.add = function(x) {
//again, irrelevant code
}
//similar methods
}
var calc = new Calculator();
然后,我试着做以下几点:
var met = calc.add;
met(5);
但它不起作用
(我已经检查了所有内容-变量'met'属于'function'类型,当我“提醒”它确定时,它会提醒正确的字符串-function(x){…}
,等等。但是调用met(7)什么都不做,而调用calc.add(7)
则会添加数字)
有人知道为什么吗,或者我如何修复它?(我可以修复它吗?当你得到一个方法的引用时,你只得到函数,它不再连接到对象。如果调用函数,
此
不是对对象的引用,而是全局窗口
对象,这就是函数中的代码不再工作的原因
要将其作为方法调用,需要进行调用,指定它应作为对象的方法运行:
met.call(calc, 5);
当你得到一个方法的引用时,你只得到函数,它不再连接到对象。如果调用函数,
此
不是对对象的引用,而是全局窗口
对象,这就是函数中的代码不再工作的原因
要将其作为方法调用,需要进行调用,指定它应作为对象的方法运行:
met.call(calc, 5);
它起作用了。你没有你认为你有的问题
function Calculator() {
//some code here, including object variables and functions, such as:
this.add = function(x) {
alert('bob');
}
//similar methods
}
var met = new Calculator().add;
met();//'bob'
正如其他人所建议的,您可能遇到了某种范围问题。met应该可以访问add方法上方建立的任何var。它可以工作。你没有你认为你有的问题
function Calculator() {
//some code here, including object variables and functions, such as:
this.add = function(x) {
alert('bob');
}
//similar methods
}
var met = new Calculator().add;
met();//'bob'
正如其他人所建议的,您可能遇到了某种范围问题。met应该可以访问add方法上方建立的任何var。实际上,
add
中的函数并不无关。您遇到的问题是,这个在javascript中的行为
当你这样称呼它时:
met(5);
window.met(5); // assuming browsers
就像这样做一样:
met(5);
window.met(5); // assuming browsers
这意味着met中的this
绑定到全局对象。因此,它不起作用的原因是,您试图添加到的任何变量在全局对象中都不存在。您可以通过在全局对象中声明该变量(对于浏览器来说恰好是全局变量)来测试它:
如果只想将别名添加到met
,但仍对calc
对象进行操作,则有两个选项。第一个是确保将add
作为calc
的方法调用:
var met = function(x) { return calc.add(x) };
met(5);
这很简单,它的工作原理与预期一致。通过添加匿名函数包装器,我们可以调用add
作为calc.add()
,这使得这个
绑定到calc
第二个是@Guffa提到的:使用call或apply to pointthis
指向您想要的任何对象:
var met = calc.add;
met.call(calc,5);
要了解更多关于这个
如何在javascript中工作的信息,请阅读以下内容:实际上,add
中的函数并不无关。您遇到的问题是,这个
在javascript中的行为
当你这样称呼它时:
met(5);
window.met(5); // assuming browsers
就像这样做一样:
met(5);
window.met(5); // assuming browsers
这意味着met中的this
绑定到全局对象。因此,它不起作用的原因是,您试图添加到的任何变量在全局对象中都不存在。您可以通过在全局对象中声明该变量(对于浏览器来说恰好是全局变量)来测试它:
如果只想将别名添加到met
,但仍对calc
对象进行操作,则有两个选项。第一个是确保将add
作为calc
的方法调用:
var met = function(x) { return calc.add(x) };
met(5);
这很简单,它的工作原理与预期一致。通过添加匿名函数包装器,我们可以调用add
作为calc.add()
,这使得这个
绑定到calc
第二个是@Guffa提到的:使用call或apply to pointthis
指向您想要的任何对象:
var met = calc.add;
met.call(calc,5);
要了解更多关于这个
如何在javascript中工作的信息,请阅读以下内容:您必须记住的是,每次调用函数时,它就好像这个是一个隐藏参数,而不是调用函数时设置并保存在函数闭包中的参数
调用met(5)时,以下内容将输出到控制台:
function Calculator() {
y = 10; // set variable
this.add = function(x) {
console.log( this.y ); // => undefined as window object does not have y
console.log( y ); // => 10 as function can access parent function's closure
function printY( ) {
console.log( y ); // => undefined as this function can only access parent function's closure and that does not contain a y variable.
}
}
}
您必须记住的是,每次调用函数时,它就好像这是一个隐藏参数,而不是调用函数时设置并保存在函数闭包中的参数
调用met(5)时,以下内容将输出到控制台:
function Calculator() {
y = 10; // set variable
this.add = function(x) {
console.log( this.y ); // => undefined as window object does not have y
console.log( y ); // => 10 as function can access parent function's closure
function printY( ) {
console.log( y ); // => undefined as this function can only access parent function's closure and that does not contain a y variable.
}
}
}
您说add
方法的函数体是不相关的,但为了安全起见:您能在这里包含它吗?如果您正在访问闭包变量或对象属性,那么这就是您的问题。。。无论如何,您调用该方法的方式确实意味着该方法依赖于object的其他属性。这可能是一个范围问题()。发布一些实际的代码。您使用的是什么浏览器(或者服务器端的环境)?@EliasVanOotegem:事实证明,它确实访问了对象属性,并且结合下面写的内容(关于“此”和上下文),这就是问题所在。谢谢你的帮助!您说add
方法的函数体是不相关的,但为了安全起见:您能在这里包含它吗?如果您正在访问闭包变量或对象属性,那么这就是您的问题。。。无论如何,您调用该方法的方式确实意味着该方法依赖于object的其他属性。这可能是一个范围问题()。发布一些实际的代码。您使用的是什么浏览器(或者服务器端的环境)?@EliasVanOotegem:事实证明,它确实访问了对象属性,并且结合下面写的内容(关于“此”和上下文),这就是问题所在。谢谢你的帮助!在现代浏览器中,使met成为calc.add的一种稍微简单的方法是v