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 point
this
指向您想要的任何对象:

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 point
this
指向您想要的任何对象:

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