摘要:一語法定義在函數(shù)運(yùn)行時(shí)指定的是值。在非嚴(yán)格模式下,為和的值會(huì)指向全局對(duì)象瀏覽器中就是對(duì)象,同時(shí)值為原始值數(shù)字,字符串,布爾值的會(huì)指向該原始值的自動(dòng)包裝對(duì)象一個(gè)數(shù)組或者類數(shù)組對(duì)象可為和方法描述與類似,只是傳入?yún)?shù)的方式不同。
一. call() 語法定義
fun.call(thisArg[, arg1[, arg2[, ...]]])
thisArg
在fun函數(shù)運(yùn)行時(shí)指定的是this值。在非嚴(yán)格模式下,thisArg為null和undefined的this值會(huì)指向全局對(duì)象(瀏覽器中就是window對(duì)象),同時(shí)值為原始值(數(shù)字,字符串,布爾值)的this會(huì)指向該原始值的自動(dòng)包裝對(duì)象
arg1,arg2,……
指定的對(duì)象的參數(shù)列表
在運(yùn)行的函數(shù)中調(diào)用另一個(gè)Object的this
通過 call 方法,你可以在一個(gè)對(duì)象上繼承另一個(gè)對(duì)象上的方法
應(yīng)用 1.使用call連接對(duì)象的構(gòu)造器(實(shí)現(xiàn)繼承)繼承某個(gè)對(duì)象的方法,對(duì)于一些公用的方法可以采取這樣的方式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引用一個(gè)函數(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ù)運(yùn)行時(shí)指定的是this值。在非嚴(yán)格模式下,thisArg為null和undefined的this值會(huì)指向全局對(duì)象(瀏覽器中就是window對(duì)象),同時(shí)值為原始值(數(shù)字,字符串,布爾值)的this會(huì)指向該原始值的自動(dòng)包裝對(duì)象
arg1,arg2,……
一個(gè)數(shù)組或者類數(shù)組對(duì)象,可為null和undefined
與call()類似,只是傳入?yún)?shù)的方式不同。
實(shí)際應(yīng)用 1. 求出數(shù)組的中的最大值function getMax(arr){ return Math.max.apply(null,arr) }2. 實(shí)現(xiàn)繼承
與call() 類似
3.確保this指向可以看一下hoverdelay.js的源碼(這段代碼是解決hover事件重復(fù)觸發(fā)的bug),setTimeout會(huì)改變this的指向(具體可以看一下這篇文章),可用that=this,保存之前的this指向,再用apply或者call重定向?yàn)樵瓉淼膖his環(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是一個(gè)類數(shù)組對(duì)象,雖然有下標(biāo),但不是真正的數(shù)組,沒有shift方法,這時(shí)可以通過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()接受的是一個(gè)參數(shù)列表,而apply()接受的是一個(gè)數(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://m.hztianpu.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] // 此時(shí)的 f1 實(shí)際上是當(dāng)作對(duì)象來使用的,對(duì)象可以調(diào)用方法 f1.apply(); // 結(jié)果是:NaN[object Window] f1.ca...
摘要:輸出的作用與和一樣,都是可以改變函數(shù)運(yùn)行時(shí)上下文,區(qū)別是和在調(diào)用函數(shù)之后會(huì)立即執(zhí)行,而方法調(diào)用并改變函數(shù)運(yùn)行時(shí)上下文后,返回一個(gè)新的函數(shù),供我們需要時(shí)再調(diào)用。 前言 js中的call(), apply()和bind()是Function.prototype下的方法,都是用于改變函數(shù)運(yùn)行時(shí)上下文,最終的返回值是你調(diào)用的方法的返回值,若該方法沒有返回值,則返回undefined。這幾個(gè)方法...
摘要:和區(qū)別其實(shí)他們的作用是一樣的,只是傳遞的參數(shù)不一樣而已。接受個(gè)參數(shù),第一個(gè)參數(shù)指定了函數(shù)體內(nèi)對(duì)象的指向,第二個(gè)參數(shù)為數(shù)組或者一個(gè)類數(shù)組??磦€(gè)栗子一個(gè)有意思的事在中,多次是無效的。而則會(huì)立即執(zhí)行函數(shù)。 背景 前兩天在做小程序的需求的時(shí)候用到bind的時(shí)候才想起自己對(duì)這三的東西的了解比較淺薄,這個(gè)時(shí)候用的時(shí)候就有點(diǎn)怕。時(shí)候還是要好好學(xué)習(xí)下,理解下怎么玩。 正文 先說call 和 apply...
摘要:和的區(qū)別和作用都是把綁定到的作用,即改變的指向,然而唯一的區(qū)別就是傳遞的參數(shù)必須得是數(shù)組的形式傳遞,而則直接連續(xù)參數(shù)傳遞和在什么地方可以用到呢當(dāng)一個(gè)對(duì)象需要調(diào)用另外一個(gè)對(duì)象里面的方法的時(shí)候就可以用到和,和可以理解成是繼承另外一個(gè)對(duì)象的方法, call和apply的區(qū)別 obj.call(thisObj, arg1, arg2, ...);obj.apply(thisObj, [arg1...
摘要:和的區(qū)別和作用都是把綁定到的作用,即改變的指向,然而唯一的區(qū)別就是傳遞的參數(shù)必須得是數(shù)組的形式傳遞,而則直接連續(xù)參數(shù)傳遞和在什么地方可以用到呢當(dāng)一個(gè)對(duì)象需要調(diào)用另外一個(gè)對(duì)象里面的方法的時(shí)候就可以用到和,和可以理解成是繼承另外一個(gè)對(duì)象的方法, call和apply的區(qū)別 obj.call(thisObj, arg1, arg2, ...);obj.apply(thisObj, [arg1...
閱讀 2555·2021-10-13 09:40
閱讀 3454·2019-08-30 13:46
閱讀 1191·2019-08-29 14:05
閱讀 3021·2019-08-29 12:48
閱讀 3726·2019-08-26 13:28
閱讀 2220·2019-08-26 11:34
閱讀 2360·2019-08-23 18:11
閱讀 1259·2019-08-23 12:26