如何将实例函数传递给外部函数
how do you pass an instance function to an outside function?
假设我有。我在文件file1.js中有以下内容:
//constructor
function Blah(){
this.string = "hello there agent ";
}
//'method'
Blah.prototype.greeting = function(num){
return this.string + num;
}
然后在一个名为file2.js的文件中,我有如下内容:
function combine(num,funct){
return funct(num);
}
最后,在名为file3的html文件中,我有这个:
var bond = new Blah();
document.write(combine(007,bond.greeting));
我实际上正在进入"greeting"方法,但由于某种原因,返回值不是字符串,而是不是NaN。知道为什么吗?greeting()方法似乎在适当的时间运行。然而,尽管如此,007似乎还是被解读为NaN。再说一遍,有什么建议可以引起这种情况吗?
Thanks a bunch in advance
首先,根据您如何调用greeting
方法,this
值将会不同。如果你把它叫做bond.greeting(num)
那么this
就是bond
。如果像funct(num)
那样调用它,其中funct
是bond.greeting
,那么this
将是全局对象。在传递函数时需要永久绑定this
,以便无论如何调用该函数都保持其值。
第二,007 === 7
。如果您想按字面意思打印007
,那么您应该使用字符串:
combine('007', bond.greeting.bind(bond));
请记住,this
取决于函数如何被调用,它是动态的,并且在运行时解析,除非您之前绑定它,就像我们上面所做的那样。
您正在体验this
关键字的特殊特性。
基本上,this
解析为您调用函数的任何内容。在您的示例中,您从全局作用域通过func()
调用它,这使得this == window
。(通过bond.greeting()
调用它就是this == bond
)
要解析,这要么bind
函数,要么强制解析:
// note that this method requires a shim for IE 8 and older
document.write(combine(007,bond.greeting.bind(bond)));
或
function combine(num, obj, funct){
// since funct is being called from obj, `this` == obj within the function
return obj[funct](num);
}
document.write(combine(007,bond, 'greeting'));
您遇到的问题是,当您将函数作为参数传递时,它是按值传递的,然后您丢失了对具有元素string = "hello there agent ";
的对象的引用,当函数执行时,它执行不存在于函数内的"this.string"
,它返回undefined
。这是一个范围问题。
使其工作良好的解决方案是传递对象bond
的引用。
function combine(num,obj){
return obj.greeting(num);
}
combine("007",bond); // returns "hello there agent 007"
1) NaN是"非数字"错误。试着用引号把007括起来2)你需要file2.js还是不需要?
var bond = new Blah();
document.write(bond.greeting("007"));
- 访问函数外部的变量
- appendChild在函数外部工作,但在函数内部不工作
- 使用在函数外部声明的变量的 Javascript 返回值 + undefined
- JavaScript未定义的函数外部JavaScript文件
- 没有在函数外部分配全局变量
- 在挖空中引用对象构造函数外部视图模型的属性
- 访问函数外部的变量
- JS:从函数外部调用变量
- 在函数外部的 Angularjs 中访问 $http.get 的结果
- JQuery 更改函数外部的变量值
- 函数外部的 clearTimeout() 无法正常工作
- Javascript - 无法获取函数来设置要在函数外部使用的全局变量
- 如何设置 var self = this;从函数外部
- 在 JavaScript 中维护函数外部变量的值
- 为什么匿名函数中的私有变量可以从 javascript 中的函数外部访问
- 如何在函数外部获取变量的值
- 如何在函数外部访问 Javascript 变量值
- 节点.js在函数外部获取 MySQL 的结果
- 如何使用 $http.get 每 3 秒发出一个新请求并在函数外部获取数据
- 在 Phonegap DB 函数中返回函数外部的变量