国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

call()和apply()

zorro / 1823人閱讀

摘要:一語法定義在函數(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 Tom
2.使用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

相關(guān)文章

  • applycall 詳細(xì)深入理解

    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...

    Hegel_Gu 評論0 收藏0
  • 理解JavaScript中的call,applybind方法

    摘要:輸出的作用與和一樣,都是可以改變函數(shù)運行時上下文,區(qū)別是和在調(diào)用函數(shù)之后會立即執(zhí)行,而方法調(diào)用并改變函數(shù)運行時上下文后,返回一個新的函數(shù),供我們需要時再調(diào)用。 前言 js中的call(), apply()和bind()是Function.prototype下的方法,都是用于改變函數(shù)運行時上下文,最終的返回值是你調(diào)用的方法的返回值,若該方法沒有返回值,則返回undefined。這幾個方法...

    chaosx110 評論0 收藏0
  • 前端基礎(chǔ):call,apply,bind的的理解

    摘要:和區(qū)別其實他們的作用是一樣的,只是傳遞的參數(shù)不一樣而已。接受個參數(shù),第一個參數(shù)指定了函數(shù)體內(nèi)對象的指向,第二個參數(shù)為數(shù)組或者一個類數(shù)組。看個栗子一個有意思的事在中,多次是無效的。而則會立即執(zhí)行函數(shù)。 背景 前兩天在做小程序的需求的時候用到bind的時候才想起自己對這三的東西的了解比較淺薄,這個時候用的時候就有點怕。時候還是要好好學(xué)習(xí)下,理解下怎么玩。 正文 先說call 和 apply...

    netmou 評論0 收藏0
  • callapply的區(qū)別用法

    摘要:和的區(qū)別和作用都是把綁定到的作用,即改變的指向,然而唯一的區(qū)別就是傳遞的參數(shù)必須得是數(shù)組的形式傳遞,而則直接連續(xù)參數(shù)傳遞和在什么地方可以用到呢當(dāng)一個對象需要調(diào)用另外一個對象里面的方法的時候就可以用到和,和可以理解成是繼承另外一個對象的方法, call和apply的區(qū)別 obj.call(thisObj, arg1, arg2, ...);obj.apply(thisObj, [arg1...

    ideaa 評論0 收藏0
  • callapply的區(qū)別用法

    摘要:和的區(qū)別和作用都是把綁定到的作用,即改變的指向,然而唯一的區(qū)別就是傳遞的參數(shù)必須得是數(shù)組的形式傳遞,而則直接連續(xù)參數(shù)傳遞和在什么地方可以用到呢當(dāng)一個對象需要調(diào)用另外一個對象里面的方法的時候就可以用到和,和可以理解成是繼承另外一個對象的方法, call和apply的區(qū)別 obj.call(thisObj, arg1, arg2, ...);obj.apply(thisObj, [arg1...

    animabear 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<