摘要:一語法定義在函數運行時指定的是值。在非嚴格模式下,為和的值會指向全局對象瀏覽器中就是對象,同時值為原始值數字,字符串,布爾值的會指向該原始值的自動包裝對象一個數組或者類數組對象可為和方法描述與類似,只是傳入參數的方式不同。
一. call() 語法定義
fun.call(thisArg[, arg1[, arg2[, ...]]])
thisArg
在fun函數運行時指定的是this值。在非嚴格模式下,thisArg為null和undefined的this值會指向全局對象(瀏覽器中就是window對象),同時值為原始值(數字,字符串,布爾值)的this會指向該原始值的自動包裝對象
arg1,arg2,……
指定的對象的參數列表
在運行的函數中調用另一個Object的this
通過 call 方法,你可以在一個對象上繼承另一個對象上的方法
應用 1.使用call連接對象的構造器(實現繼承)繼承某個對象的方法,對于一些公用的方法可以采取這樣的方式Object.apply(this,arguments),沒必要重復聲明相同的方法。
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引用一個函數且指定上下文環境
function showContent(){ var content="這篇文章的標題是"+this.title+" 作者是"+this.author; console.log(content); } var article={ title:"hello world", author:"coder" } showContent.call(article) //這篇文章的標題是hello world 作者是coder二. apply() 語法定義
fun.apply(thisArg, [argsArray])
thisArg
在fun函數運行時指定的是this值。在非嚴格模式下,thisArg為null和undefined的this值會指向全局對象(瀏覽器中就是window對象),同時值為原始值(數字,字符串,布爾值)的this會指向該原始值的自動包裝對象
arg1,arg2,……
一個數組或者類數組對象,可為null和undefined
與call()類似,只是傳入參數的方式不同。
實際應用 1. 求出數組的中的最大值function getMax(arr){ return Math.max.apply(null,arr) }2. 實現繼承
與call() 類似
3.確保this指向可以看一下hoverdelay.js的源碼(這段代碼是解決hover事件重復觸發的bug),setTimeout會改變this的指向(具體可以看一下這篇文章),可用that=this,保存之前的this指向,再用apply或者call重定向為原來的this環境。
(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是一個類數組對象,雖然有下標,但不是真正的數組,沒有shift方法,這時可以通過call或者apply方法調用Array.prototype中的shift方法。
三.區別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()接受的是一個參數列表,而apply()接受的是一個數組參數。(方便記憶的小技巧:Apply for array and Call for comma.)
function showContent(title,author){ var content="這篇文章的標題是"+title+" 作者是"+author; console.log(content); } showContent.apply(undefined, ["hello", "Jim"]); //這篇文章的標題是hello 作者是Jim showContent.call(undefined, "world", "Join"); //這篇文章的標題是world 作者是Join四.參考資料
Function.prototype.call()
Function.prototype.apply()
What is the difference between call and apply?
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/80171.html
apply 與 call 介紹 function f1(x, y) { console.log(結果是: + (x + y) + this); } f1(10, 20); //函數的調用 // 結果是:30[object Window] // 此時的 f1 實際上是當作對象來使用的,對象可以調用方法 f1.apply(); // 結果是:NaN[object Window] f1.ca...
摘要:輸出的作用與和一樣,都是可以改變函數運行時上下文,區別是和在調用函數之后會立即執行,而方法調用并改變函數運行時上下文后,返回一個新的函數,供我們需要時再調用。 前言 js中的call(), apply()和bind()是Function.prototype下的方法,都是用于改變函數運行時上下文,最終的返回值是你調用的方法的返回值,若該方法沒有返回值,則返回undefined。這幾個方法...
摘要:和區別其實他們的作用是一樣的,只是傳遞的參數不一樣而已。接受個參數,第一個參數指定了函數體內對象的指向,第二個參數為數組或者一個類數組。看個栗子一個有意思的事在中,多次是無效的。而則會立即執行函數。 背景 前兩天在做小程序的需求的時候用到bind的時候才想起自己對這三的東西的了解比較淺薄,這個時候用的時候就有點怕。時候還是要好好學習下,理解下怎么玩。 正文 先說call 和 apply...
摘要:和的區別和作用都是把綁定到的作用,即改變的指向,然而唯一的區別就是傳遞的參數必須得是數組的形式傳遞,而則直接連續參數傳遞和在什么地方可以用到呢當一個對象需要調用另外一個對象里面的方法的時候就可以用到和,和可以理解成是繼承另外一個對象的方法, call和apply的區別 obj.call(thisObj, arg1, arg2, ...);obj.apply(thisObj, [arg1...
摘要:和的區別和作用都是把綁定到的作用,即改變的指向,然而唯一的區別就是傳遞的參數必須得是數組的形式傳遞,而則直接連續參數傳遞和在什么地方可以用到呢當一個對象需要調用另外一個對象里面的方法的時候就可以用到和,和可以理解成是繼承另外一個對象的方法, call和apply的區別 obj.call(thisObj, arg1, arg2, ...);obj.apply(thisObj, [arg1...
閱讀 2458·2021-10-13 09:40
閱讀 3345·2019-08-30 13:46
閱讀 1130·2019-08-29 14:05
閱讀 2964·2019-08-29 12:48
閱讀 3665·2019-08-26 13:28
閱讀 2157·2019-08-26 11:34
閱讀 2292·2019-08-23 18:11
閱讀 1168·2019-08-23 12:26