js apply call caller callee bind 使用方法 区别分析

原文地址

http://www.jb51.net/article/20640.htm

一、call 方法

call([thisObj[,arg1[, arg2[, [,.argN]]]]])

call 方法可以用另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。

示例

[pcsh lang="js" tab_size="4" message="" hl_lines="" provider="manual"]

function Obj() {
    this.value = "对象!";
}
var value = "global 变量";

function Fun1() {
    alert(this.value);
}
window.Fun1(); //global 变量 
Fun1.call(window); //global 变量 
Fun1.call(document.getElementById('myText')); //input text 
Fun1.call(new Obj()); //对象!

[/pcsh]

这里的Fun1函数每次执行call方法都会被更换一次调用的对象(thisObj)

二、apply方法

apply和call两者在作用上相同,两者在参数上有区别

如 func.call(func1,var1,var2,var3)对应的apply写法为:func.apply(func1,[var1,var2,var3])

apply方法只有两个参数,一个是替换的对象,一个是参数数组

三、caller 属性

可以参见上一篇文章

caller方法 返回一个对函数的引用,即调用了当前函数的函数体。

四、callee属性

返回正被执行的 Function 对象,也就是所指定的 Function 对象的正文。

五、bind

bind和apply call方法都是改变当前函数的执行对象execute context,特别之处是apply和call方法调用后,方法会直接被调用,如上面的例子,而bind方法改变了执行对象后,可以稍候执行

如下所示

[pcsh lang="js" tab_size="4" message="" hl_lines="" provider="manual"]

var first_object = {
    num: 42
};
var second_object = {
    num: 24
};

function multiply(mult) {
    return this.num * mult;
}
Function.prototype.bind = function(obj) {
    var method = this,
        temp = function() {
            return method.apply(obj, arguments);
        };
    return temp;
}
var first_multiply = multiply.bind(first_object);
first_multiply(5); // returns 42 * 5 
var second_multiply = multiply.bind(second_object);
second_multiply(5); // returns 24 * 5

[/pcsh]

例二

[pcsh lang="js" tab_size="4" message="" hl_lines="" provider="manual"]

function add(arg1, arg2, arg3, arg4) {
    return arg1 + ' ' + arg2 + ' ' + arg3 + ' ' + arg4;
}
var addMore = add.bind({}, 'a', 'b');
console.log(addMore('c', 'd')); // a b c d

[/pcsh]

 

 

此处评论已关闭