1. 程式人生 > >javascript中call和apply的模擬實現

javascript中call和apply的模擬實現

call()

call() 方法呼叫一個函式, 其具有一個指定的this值和分別地提供的引數(引數的列表)。

語法:fun.call(thisArg, arg1, arg2, ...)

例項:

var name="lee";
var obj={
    name:"lwf"
};
function foo(){
    console.log(this.name);
}
foo();//lee(瀏覽器環境)
foo.call();//lee,無引數,this預設指向window
foo.call(null);//,lee,指向window
foo.call(undefined);//lee,指向window
foo.call(obj);//lwf。有引數,this指向obj
var obj={
    name:"lwf"
};
function foo(age){
    console.log(age);
}
foo.call(obj,21);//21
var obj={
    name:"lwf"
};
function foo(age){
    return age;
}
console.log(foo.call(obj,21));//21

由此可以看到call方法的作用:

  1. 如果沒有引數,或者只有一個引數,引數為null,undefined時,this指向window
  2. 如果有多個引數,並且引數不確定,第一個引數作為this繫結的物件,其餘引數作為引數傳入foo方法
  3. 如果foo方法有返回值,那麼使用call呼叫後,也應該是有返回值的

    據此,我們實現瞭如下函式:

Function.prototype.call2=function(context){
    var context=context||window;//考慮有引數和沒有引數的情況的this指向
    context.fn=this;//把呼叫call的方法作為指定的上下文物件的一個屬性
    var args=[].slice.call(arguments,1);//取得除了上下文物件以外的引數
    var result=eval('context.fn('+args+')');//考慮有無return,執行該方法
delete context.fn;//刪除該方法 return result; };

類似的,apply的模擬實現:

Function.prototype.apply2=function(context){
    var context=context||window;
    context.fn=this;
    var args=arguments[1];
    var result;
    if(args){
        result=eval('context.fn('+args+')');
    }else{
        result=context.fn();
    }
    delete context.fn;
    return result;
};

相關推薦

javascriptcallapply模擬實現

call() call() 方法呼叫一個函式, 其具有一個指定的this值和分別地提供的引數(引數的列表)。 語法:fun.call(thisArg, arg1, arg2, ...) 例

JavaScriptcallapply方法的使用

acvaScript中的call()方法和apply()方法,在某些時候這兩個方法還確實是十分重要的。1. 每個函式都包含兩個非繼承而來的方法:call()方法和apply()方法。2. 相同點:這兩個方法的作用是一樣的。都是在特定的作用域中呼叫函式,等於設定函式體內this物件的值,以擴充函式賴以執行的作用

Javascriptcallapply的區別與詳解

轉自:http://www.7old.com/jiaocheng/show-1412.html在js中call和apply它們的作用都是將函式繫結到另外一個物件上去執行,兩者僅在定義引數方式有所區別,下面我來給大家介紹一下call和apply用法。 在web前端開發過程中

javascriptcall()apply()方法的區別

首先需要知道 call 和 apply 都是js 物件 prototype的方法 在使用的時候主要區別: var foo() = function(){ ....//程式碼段 } // foo.

JavaScript callapply

nbsp clas div 其余 color 接收 style pre ava call()方法和apply()方法的作用相同,他們的區別在於接收參數的方式不同。 對於call(),第一個參數是this值沒有變化,變化的是其余參數都直接傳遞給函數。(在使用call()方法時

Javascriptcallapplybind的區別以及原始碼解析

我們知道在javascript中call和apply以及bind都可以改變this指向,那麼它們是怎麼實現的呢?彼此之間有什麼區別呢?首先我們先來分別解析一下它們: (一)call 首先我們先來看一下如何使用call: var valu

javascriptcallapply、bind詳解

組裝 div 分析 rgs 特性 類型 bind詳解 中修改 不支持 1.apply和call的區別在哪裏 2.什麽情況下用apply,什麽情況下用call 3.apply的其他巧妙用法(一般在什麽情況下可以使用apply) 我首先從網上查到關於apply和

javascriptcall()、apply()、bind()的用法

javascript中call()、apply()、bind()的用法 其實是一個很簡單的東西,認真看十分鐘就從一臉懵B 到完全 理解! 先看明白下面: 例1 obj.objAge; //17 obj.myFun() //小張年齡undefined 例2 show

javascriptcall()、apply()、bind()的用法理解

一、bind的用法 第一個:obj.showInfo('arg','arg_18');中傳的2個引數通過showInfo方法改變的是obj下中的name和age 第二個:obj.showInfo.bind(this)('bind','bind_18');中bind要傳的name和age是通過一個一個傳

【轉】詳解 JavaScriptcall() apply()

定義 ECMAScript規範為所有函式都包含兩個方法(這兩個方法非繼承而來), call 和 apply 。這兩個函式都是在特定的作用域中呼叫函式,能改變函式的作用域,實際上是改變函式體內 this 的值 。 call 和 app

JavaScript callapply、bind 的使用

今天遇到一道關於call與apply使用的題目,在此總結一下關於 call 與 apply 的使用方法。 題目如下:以下程式執行結果為3的選項是? var a = {X:1,Y:2}; var b = { X:2, Y:2, add:function(){

javascriptcall()、apply()、bind()的用法終於理解

其實是一個很簡單的東西,認真看十分鐘就從一臉懵B 到完全 理解! 先看明白下面: 例 1 obj.objAge; // 17 obj.myFun() // 小張年齡 undefined 例 2 shows() // 盲僧  比較一下這兩者 this

js的面試筆試--javascriptcall()、apply()、bind()方法的區別

在JavaScript 中,this的指向是動態變化的,很可能在寫程式的過程中,無意中破壞掉this的指向,所以我們需要一種可以把this的含義固定的技術,於是就有了call,apply 和bind這三個方法,來改變函式體內部 this 的指向,因為函式存在「定義時上下文」和

jscall()apply()的區別

JS中每個函式都包含兩個非繼承而來的方法:apply()和call()。這兩個方法都用於在特定的作用域中呼叫函式,即將一個函式繫結到另一個函式中,比如有兩個函式A和B,要在B函式中呼叫A函式,就需要用到這兩個方法,說白了就是設定函式體內this物件的值。    call

整理JavaScriptCallApply區別

function classA() { this.name='bluedestiny'; this.show = function () { // alert(this.name); } } function classB(

JavaScript call()、 apply()、 bind()改變this指向理解

  最近開發的過程中遇到了this指向問題,首先想到的是call()、apply()、bind()三個方法,有些時候這三個方法確實是十分重要,現在我們就把他們的使用方法及異同點講解一下。   1、每個函式都包含三個非繼承而來的方法,call()方法、apply()方法和bind()方法   &nbs

bind,callapply模擬實現

首先,三者第一個引數都為this指向 區別 bind返回的是一個函式體 call和apply會直接執行,但是call引數需要一個一個進行傳遞,apply的第二個引數是一個數組 實現 bind 簡單實現 Function.prototype.myBind = function(context){ s

Javascriptbind,call,apply模擬實現

Function.prototype.bindFake = function(context) { let fn = this; let arr = Array.prototype.slice.call(arguments, 1); re

10.JavaScript深入之callapply模擬實現

call 一句話介紹 call: call() 方法在使用一個指定的 this 值和若干個指定的引數值的前提下呼叫某個函式或方法。 舉個例子: var foo = { value: 1 }; function bar() { console.l

Javascriptcall()方法apply()方法的作用與區別

形式 時速 有效 let 調用函數 ply lane pan arguments ECMAScript規範所有函數都包含兩個非繼承的方法,分別為call()和apply(),這兩個函數都是在特定的作用域中調用函數,能改變函數的作用域,實際上是改變函數體內“t