简短回答:
您可以设置这
使用函数的.call()
和.apply()
方法。
详细答案:
这个这
任何函数上的变量都类似于论据
变量(这可能是你不知道的)。它是在调用函数时设置的,是函数调用方式的工件。为了解释,让我先演示一下论据
考虑:
myFunction=函数(){返回参数.length;};
现在,让我们看看几个电话myFunction(我的功能)
:
myFunction()//是0myFunction(空)//是1myFunction(未定义)//是1myFunction(0,0,00,0)//是5
正如您所见参数.长度
不是取决于我们如何或在哪里编写函数,而是取决于我们如何打电话函数。对于这
变量(也称为“调用对象”)。设置调用对象的方法只有三种(ES5中有第四种,但我们将忽略这一点):
- 您可以使用点表示(例如。
something.myFunction()
)
- 您可以使用函数的
.call()
或.apply()
方法(例如。myFunction.call(someObject)
)
- 如果没有使用方法#1或#2进行设置,它将默认为全局对象(例如。
窗口
)
所以大多数人都习惯了第一种方法。如果将函数指定为对象的属性,然后使用对象和点表示调用该函数,则对象将设置为这
如此:
var myFn=(function(){return this.x});var myObj={x: 1、,y: 我的Fn};myObj.myFn()//是1
但我们也可以使用方法2,如果我的Fn
不是我们要调用的对象的属性,但该对象的形式正确我的Fn
能够对此采取行动(参见:duck typeing):
var myOtherObj={x: 2个}myFn.call(myOtherObj)//是2myFn.apply(myOtherObj)//是2myFn.apply({x:3})//是3
很酷,嗯?jQuery就是这样做的.apply(event.target)
(设置这
事件的目标对象)。他们以更复杂的方式进行这项工作,因为回调
框架,但想法是有的.
无论如何,如果我不解释一下方法#3,我不会给出一个很长的答案,因为它会让一些人发疯:如果你不设置调用对象,会发生什么?
因为所有全局变量都是全局对象的隐式属性,所以您可以从方法#3中获得一些有趣的效果。例如:
变量x=4;myFn()//是4
但大多数情况下,您都没有足够幸运地使全局对象满足函数对其调用对象的要求,因此通常只会导致错误和很多挫折。
可能比您想要的要多,但希望您现在对调用对象及其狡猾的方式有了更多的了解。