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

資訊專欄INFORMATION COLUMN

call()和apply()

zorro / 1824人閱讀

摘要:一語法定義在函數運行時指定的是值。在非嚴格模式下,為和的值會指向全局對象瀏覽器中就是對象,同時值為原始值數字,字符串,布爾值的會指向該原始值的自動包裝對象一個數組或者類數組對象可為和方法描述與類似,只是傳入參數的方式不同。

一. 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 Tom
2.使用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

相關文章

  • applycall 詳細深入理解

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

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

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

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

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

    netmou 評論0 收藏0
  • callapply的區別用法

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

    ideaa 評論0 收藏0
  • callapply的區別用法

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

    animabear 評論0 收藏0

發表評論

0條評論

zorro

|高級講師

TA的文章

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