让我说我在名为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));
我实际上正在进入"问候"方法,但由于某种原因,返回值,而不是一个字符串,结束不是NaN。知道为什么吗? greeting()方法似乎在适当的时候运行。然而,尽管如此,007似乎被解释为NaN无论如何。再次,任何关于可能导致这种情况的建议?
提前感谢一堆
答案 0 :(得分:2)
首先,根据您调用greeting
方法的方式,this
值会有所不同。如果您将其称为bond.greeting(num)
,则this
将为bond
。如果您将其称为funct(num)
,其中funct
为bond.greeting
,则this
将成为全局对象。在传递函数时,您需要永久绑定this
,无论您如何调用函数,都要保持其值。
其次,007 === 7
。如果你想从字面上打印007
,那么你应该使用一个字符串:
combine('007', bond.greeting.bind(bond));
请记住,this
取决于函数如何被调用,它是动态的,并且解析了运行时,除非你先前绑定它,就像我们上面那样。
答案 1 :(得分:1)
您遇到了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'));
答案 2 :(得分:0)
1)NaN是“非数字”错误。尝试将007封装在引号中 2)你需要file2.js还是没有它?
var bond = new Blah();
document.write(bond.greeting("007"));
答案 3 :(得分:0)
你遇到的问题是当你将函数作为参数传递时,它会按值传递,然后你松开对具有元素string = "hello there agent ";
的对象的引用,并且当函数执行时,它会执行{ {1}}在函数内部不存在,它返回"this.string"
。这是一个范围问题。
使其运行良好的解决方案是传递作为对象undefined
bond