Predefined:js中的this指向直接運行上下文。 call和apply是ECMASCRIPT 3在函數原型上所定義的方法,目的在於改變或指定this的指向,從而改變函數直接執行上下文。兩者的不同之處在於傳參,call接受多個參數,而apply接受數組。 1:隱藏的call和apply: 默 ...
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