摘要:一語法定義在函數(shù)運行時指定的是值。在非嚴(yán)格模式下,為和的值會指向全局對象瀏覽器中就是對象,同時值為原始值數(shù)字,字符串,布爾值的會指向該原始值的自動包裝對象一個數(shù)組或者類數(shù)組對象可為和方法描述與類似,只是傳入?yún)?shù)的方式不同。
一. call() 語法定義
fun.call(thisArg[, arg1[, arg2[, ...]]])
thisArg
在fun函數(shù)運行時指定的是this值。在非嚴(yán)格模式下,thisArg為null和undefined的this值會指向全局對象(瀏覽器中就是window對象),同時值為原始值(數(shù)字,字符串,布爾值)的this會指向該原始值的自動包裝對象
arg1,arg2,……
指定的對象的參數(shù)列表
在運行的函數(shù)中調(diào)用另一個Object的this
通過 call 方法,你可以在一個對象上繼承另一個對象上的方法
應(yīng)用 1.使用call連接對象的構(gòu)造器(實現(xiàn)繼承)繼承某個對象的方法,對于一些公用的方法可以采取這樣的方式Object.apply(this,arguments),沒必要重復(fù)聲明相同的方法。
function People(name, age) { this.name = name; this.age= age; this.sayName=function(){ console.log("my Name is "+name); } } function one(name, age) { People.call(this, name, age); } function two(name, age) { People.call(this, name, age); } var one= new one("Jim", 25); var two= new two("Tom", 40); one.sayName(); //my Name is Jim two.sayName(); //my Name is Tom2.使用call引用一個函數(shù)且指定上下文環(huán)境
function showContent(){ var content="這篇文章的標(biāo)題是"+this.title+" 作者是"+this.author; console.log(content); } var article={ title:"hello world", author:"coder" } showContent.call(article) //這篇文章的標(biāo)題是hello world 作者是coder二. apply() 語法定義
fun.apply(thisArg, [argsArray])
thisArg
在fun函數(shù)運行時指定的是this值。在非嚴(yán)格模式下,thisArg為null和undefined的this值會指向全局對象(瀏覽器中就是window對象),同時值為原始值(數(shù)字,字符串,布爾值)的this會指向該原始值的自動包裝對象
arg1,arg2,……
一個數(shù)組或者類數(shù)組對象,可為null和undefined
與call()類似,只是傳入?yún)?shù)的方式不同。
實際應(yīng)用 1. 求出數(shù)組的中的最大值function getMax(arr){ return Math.max.apply(null,arr) }2. 實現(xiàn)繼承
與call() 類似
3.確保this指向可以看一下hoverdelay.js的源碼(這段代碼是解決hover事件重復(fù)觸發(fā)的bug),setTimeout會改變this的指向(具體可以看一下這篇文章),可用that=this,保存之前的this指向,再用apply或者call重定向為原來的this環(huán)境。
(function($){ $.fn.hoverDelay = function(options){ var defaults = { hoverDuring: 200, outDuring: 200, hoverEvent: function(){ $.noop(); }, outEvent: function(){ $.noop(); } }; var sets = $.extend(defaults,options || {}); var hoverTimer, outTimer, that = this; return $(this).each(function(){ $(this).hover(function(){ clearTimeout(outTimer); //使用apply() hoverTimer = setTimeout(function(){sets.hoverEvent.apply(that)}, sets.hoverDuring); },function(){ clearTimeout(hoverTimer); outTimer = setTimeout(function(){sets.outEvent.apply(that)}, sets.outDuring); }); }); } })(jQuery);4. Array.prototype.shift.call(arguments)
Array.prototype.shift.call(arguments),arguments是一個類數(shù)組對象,雖然有下標(biāo),但不是真正的數(shù)組,沒有shift方法,這時可以通過call或者apply方法調(diào)用Array.prototype中的shift方法。
三.區(qū)別MDN原文:
While the syntax of this function is almost identical to that of call(), the fundamental difference is that call() accepts an argument list, while apply() accepts a single array of arguments.
call()和apply()的用法幾乎相同,不同之處在于call()接受的是一個參數(shù)列表,而apply()接受的是一個數(shù)組參數(shù)。(方便記憶的小技巧:Apply for array and Call for comma.)
function showContent(title,author){ var content="這篇文章的標(biāo)題是"+title+" 作者是"+author; console.log(content); } showContent.apply(undefined, ["hello", "Jim"]); //這篇文章的標(biāo)題是hello 作者是Jim showContent.call(undefined, "world", "Join"); //這篇文章的標(biāo)題是world 作者是Join四.參考資料
Function.prototype.call()
Function.prototype.apply()
What is the difference between call and apply?
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/80171.html
apply 與 call 介紹 function f1(x, y) { console.log(結(jié)果是: + (x + y) + this); } f1(10, 20); //函數(shù)的調(diào)用 // 結(jié)果是:30[object Window] // 此時的 f1 實際上是當(dāng)作對象來使用的,對象可以調(diào)用方法 f1.apply(); // 結(jié)果是:NaN[object Window] f1.ca...
摘要:輸出的作用與和一樣,都是可以改變函數(shù)運行時上下文,區(qū)別是和在調(diào)用函數(shù)之后會立即執(zhí)行,而方法調(diào)用并改變函數(shù)運行時上下文后,返回一個新的函數(shù),供我們需要時再調(diào)用。 前言 js中的call(), apply()和bind()是Function.prototype下的方法,都是用于改變函數(shù)運行時上下文,最終的返回值是你調(diào)用的方法的返回值,若該方法沒有返回值,則返回undefined。這幾個方法...
摘要:和區(qū)別其實他們的作用是一樣的,只是傳遞的參數(shù)不一樣而已。接受個參數(shù),第一個參數(shù)指定了函數(shù)體內(nèi)對象的指向,第二個參數(shù)為數(shù)組或者一個類數(shù)組。看個栗子一個有意思的事在中,多次是無效的。而則會立即執(zhí)行函數(shù)。 背景 前兩天在做小程序的需求的時候用到bind的時候才想起自己對這三的東西的了解比較淺薄,這個時候用的時候就有點怕。時候還是要好好學(xué)習(xí)下,理解下怎么玩。 正文 先說call 和 apply...
摘要:和的區(qū)別和作用都是把綁定到的作用,即改變的指向,然而唯一的區(qū)別就是傳遞的參數(shù)必須得是數(shù)組的形式傳遞,而則直接連續(xù)參數(shù)傳遞和在什么地方可以用到呢當(dāng)一個對象需要調(diào)用另外一個對象里面的方法的時候就可以用到和,和可以理解成是繼承另外一個對象的方法, call和apply的區(qū)別 obj.call(thisObj, arg1, arg2, ...);obj.apply(thisObj, [arg1...
摘要:和的區(qū)別和作用都是把綁定到的作用,即改變的指向,然而唯一的區(qū)別就是傳遞的參數(shù)必須得是數(shù)組的形式傳遞,而則直接連續(xù)參數(shù)傳遞和在什么地方可以用到呢當(dāng)一個對象需要調(diào)用另外一個對象里面的方法的時候就可以用到和,和可以理解成是繼承另外一個對象的方法, call和apply的區(qū)別 obj.call(thisObj, arg1, arg2, ...);obj.apply(thisObj, [arg1...
閱讀 2451·2021-10-13 09:40
閱讀 3338·2019-08-30 13:46
閱讀 1125·2019-08-29 14:05
閱讀 2961·2019-08-29 12:48
閱讀 3657·2019-08-26 13:28
閱讀 2148·2019-08-26 11:34
閱讀 2284·2019-08-23 18:11
閱讀 1163·2019-08-23 12:26