Predefined:js中的this指向直接运行上下文。
call和apply是ECMASCRIPT 3在函数原型上所定义的方法,目的在于改变或指定this的指向,从而改变函数直接执行上下文。两者的不同之处在于传参,call接受多个参数,而apply接受数组。
1:隐藏的call和apply:
1 var a = "hello"; 2 3 function foo(){ 4 alert(this.a) 5 } 6 7 foo() ; //"hello" 8 foo.call(window); // "hello"
// window.foo() == foo.call(window);
默认的,我们认为:若函数以函数名+小括号方式执行,那么会调用原型中的call方法(此处只讨论call方法),动态的指定直接执行上下文.
2:常用技巧:
function superType(name){ this.name = name; } function SubType(name){ superType(name) } var instance = new SubType("lihua"); console.log(instance.name); //undefined; console.log(global.name); //lihua //在借用构造函数中 function superType(name){ this.name = name; } function SubType(name){ superType.call(this,name) } var instance = new SubType("lihua"); console.log(instance.name); //lihua; console.log(global.name); //undefined
//使用apply改变传参方式 var countArr = [1,2,3,13,24,5,21]; Math.max(countArr); //NaN(类型转换) Math.max.apply(Math,countArr) //24