1. js中apply和Math.max()函數的問題
Function.apply()是JS的一個OOP特性,一般用來模擬繼承和擴展this的用途,對於上面這段代碼,可以專這樣去理解屬:
XXX.apply是一個調用函數的方法,其參數為:apply(Function, Args),
Function為要調用的方法,Args是參數列表,當Function為null時,默認為上文,
即
Math.max.apply(null, arr)
可認為是
apply(Math.max, arr)
然後,arr是一個參數列表,對於max方法,其參數是若干個數,即
Math.max(a, b, c, d, ...)
當使用apply時,把所有參數加入到一個數組中,即
arr = [a, b, c, d, ...]
代入到原式,
Math.max.apply(null, [a, b, c, d, ...])
實際上等同於
Math.max(a, b, c, d, ...)
在此處,使用apply的優點是在部分JS引擎中提升性能。
2. 如何理解和熟練運用js中的call及apply
call和apply
obj.call(thisObj, arg1, arg2, ...);
obj.apply(thisObj, [arg1, arg2, ...]);
兩者作用一致,都是把尺瞎obj(即this)綁定到thisObj,這時候thisObj具備了obj的屬性和方法。或者說thisObj『繼承』了obj的屬性和方法。綁定後會立即執行函數。
唯一區別是apply接受的是數組參數,call接受的是連續參數。
function add(j, k){
return j+k;
}
function sub(j, k){
return j-k;
}
我們在控制台運行:
add(5,3); //8
add.call(sub, 5, 3); //8
add.apply(sub, [5, 3]); //8
sub(5, 3); //2
sub.call(add, 5, 3); //2
sub.apply(add, [5, 3]); //2
調用原生對象的方法
示例:
var a = {0:1, 1:"yjc", length: 2};
a.slice(); //TypeError: a.slice is not a function
Array.prototype.slice.call(a);//[1, "yjc"]
對象a類似array,但不具備array的slice等方法。使用call綁定,這時候就可以調用slice方法。
實現繼承
通過call和apply,我們可以實現對象繼承。示例:
var Parent = function(){
this.name = "yjc";
this.age = 22;
}
var child = {};
console.log(child);//Object {} ,空對象
Parent.call(child);
console.log(child); //Object {name: "yjc", age: 22}
以上實現了對象孝塵的繼承。
bind的使用
obj.bind(thisObj, arg1, arg2, ...);
把obj綁定到thisObj,這時候thisObj具備了obj的屬性和方法。與call和apply不同的是,巧困禪bind綁定後不會立即執行。
同樣是add()和sub():
add.bind(sub, 5, 3); //不再返回8
add.bind(sub, 5, 3)(); //8
如果bind的第一個參數是null或者undefined,等於將this綁定到全局對象。
3. 在JS中,call()方法和apply()方法到底該怎麼應用
1.apply與call是更改對象的內部指針,即改變對象的this指向的內容;
2.call與apply的第一個參數都是要傳入給當版前對象的對象,及權函數內部的this,後面的參數都是傳遞給當前對象的參數。
4. js數組中的apply什麼意思
apply()的作用是指定函數作用域和傳參,不是數組專用的
apply(作返悶旁用域對象,參數1,參數罩塌2,參漏橡數n...)
5. Javascript中call和apply的區別與詳解
call()方法
用於操作this的函數方法是call(),它可以指定的this值和參數來執行函數。call()的第一個參數指定了函數執行時this的值,其後的所有參數都是需要被傳入函數的參數。
apply()方法
apply()是你可以用來操作this的第二個函數方法。apply()的工作方裂者辯式和call()完全一樣,但它只能接受兩個參數: this 的值和一個數組或者類似數組的對肆缺象,內含需要被傳入函數的參數(也就是說你可以把arguments對象作為apply()的第二個參數)。你不需要像使用call()那樣一個個指嫌鉛定參數,而是可以輕松傳遞整個數組給apply()。除此之外,call()和apply()表現得完全一樣。
bind()方法
改變this的第三個函數方法是bind()。ECMAScript 5中新加的這個方法和之前那兩個頗有不同。按慣例,bind()的第一個參數是要傳給新函數的this的值。其他所有參數代表需要被永久設置在新函數中的命名參數。你可以在之後繼續設置任何非永久參數。
資料來源:
HTML5學堂
決勝前端
6. Js中call和apply的區別和用法是什麼
JavaScript中有一個call和apply方法,其作用基本相同,但也有略微的區別。x0dx0a先來看看JS手冊中對call的解釋:x0dx0acall 方法x0dx0a 調用一個對象的一個方法,以另一個對象替換當前對象。x0dx0acall([thisObj[,arg1[, arg2[, [,.argN]]]]])x0dx0a參數x0dx0athisObjx0dx0a可選項。將被用作當前對象的對象。x0dx0aarg1, arg2, , argNx0dx0a可選項。將被傳遞方法參數序列。x0dx0a說明x0dx0acall 方法可以用來代替另一個對象調用一個方法。call 方法可將一個函數的對象上下文從初始的上下文改變為由 thisObj 指定的新對象。x0dx0a 如果沒有提供 thisObj 參數,那麼 Global 對象被用作 thisObj。x0dx0a x0dx0a說明白一點其實就是更改對象的內部指針,即改變對象的this指向的內容。這在面向對象的js編程過程中有時是很有用的。x0dx0ax0dx0ax0dx0acall函數和apply方法的第一個參數都是要傳入給當前對象的對象,及函數內部的this。後面的參數都是傳遞給當前對象的參數。x0dx0a 運行如下代碼:x0dx0ax0dx0a可見分別彈出了func和var。到這里就對call的每個參數的意義有所了解了。x0dx0ax0dx0a 對於apply和call兩者在作用上是相同的,但兩者在參數上有區別的。x0dx0a對於第一個參數意義都一樣,但對第二個參數:x0dx0aapply傳入的是一個參數數組,也就是將多個參數組合成為一個數組傳入,而call則作為call的參數傳入(從判指仿第二個參數開始)。x0dx0a 如 func.call(func1,var1,var2,var3)對應的apply寫法為:func.apply(func1,[var1,var2,var3])x0dx0ax0dx0a同時使用apply的好處是逗祥可以直接將當前函數的arguments對象作為apply的第二個參數傳入
7. js中call,apply和bind方法的區別和使用場景
在js中,所有的函復數再被調用制的時候都會默認傳入兩個參數,一個是this,還有一個是arguments。在默認情況下this都是指當前的調用函數的對象。但是有時候我們需要改變this的指向,也就是說使函數可以被其他對象來調用,那麼我們應該怎樣做呢?這時候我們就可以使用call,apply和bind方法了。
1.首先搞清楚call,apply和bind方法的來歷
在js中所有的函數都是Function的實例,而且對於Function來說,它的原型即Function.prototype中含有很多東西,其中call,apply和bind方法就是Function原型中的方法,所以根據原型的規則,所有的函數都可以使用原型中屬性和方法,所以來說,對於所有的函數都可以使用call,apply和bind方法。
簡單一句話:call,apply和bind都是Function原型中的方法,而所有的函數都是Function的實例。
8. 如何理解和熟練運用js中的call及apply
書上都有例子,多看弊螞看,照著打幾次,就感覺出來了,
call和apply的用途都是在特定的作用域中調用函數,實際上等於設置函數體內this對象的值,也就是把想要運行的代碼的作用域拿過來。比如你有一個函數o 但是如果直接執行,因為現在在當期作用域中並沒有定義函數o。而是在另外一個函數作用域中定義的,比如
Window.color=「 red「;
var o={color:「blue」};
function sayColor(){
alert(this.color);
}
sayColor();// red
sayColor(this);//咐廳red
sayColor(window);//red
sayColor(o);//blue
他們的區別僅在於接受參數的不同
首先apply()方法接受兩個參數一個是在其中運行函數的作用域,另一個是參數數組,其中第二個可以是Array的實例也可以是arguments對象
對於call()方法而言,第一個參數是this值沒有變化,變化的是其餘參數直接傳遞給函數。換句話說,在使用call()方法時,傳遞給函數的參數必租簡埋須逐個列舉出來
具體可以看JavaScript高級程序設計的116頁,網上有pdf版本的下載
9. 在JS中,call()方法和apply()方法到底該怎麼應用
1.apply與call是更改對象的內部指針,即改變對象的this指向的內容;
2.call與apply的第一個參數都是要傳入給當前對象的對象,及函數內部的this,後面的參數都是傳遞給當前對象的參數。
10. 關於js中apply的用法,請幫我解釋下這個什麼意思
call 和apply都可以切換函數執行的上下文。
只不過apply的第二個參數支持數組,而call支持多個參數。
這個語法在紅皮書里有講。