call,bind,apply,caller,callee

梦想游戏人
目录:
Node.js

a.print()   函数调用等效于  a[“print”]()

1.call

javascript中的call 会更改this(吧调用的对象更改为参数)

function A() {
    this.x = 10;
    
    this.print = function () {
        console.log(this.x);
    };
}

function B() {
    this.x = 2;
    
    this.print = function () {
        console.log(this.x);
    };

}

a = new A();
b = new B();

a.print.call(b);  //输出2 ,print内部的this被替换为了b ,所以实际调用的是b的print,等效于b.print()


2.apply

apply 和call作用差不多区别在于call必须把参数列出来,apply是数组,如:



function A() {
    this.x = 10;
    
    this.print = function (str ,s2) {
        console.log(str + this.x + s2);
    };
}

function B() {
    this.x = 2;
    this.print = function (str,s2) {
        console.log(str + this.x   + s2);
    };

}

a = new A();
b = new B();

a.print.call(b,"...   ",0); // print的参数必须给出
a.print.apply(b, ["...  ", 0]);// print的参数是数组

3.bind

bind 和其他许多语言的bind都差不多,等效于闭包,提供了一个临时的参数列表。如pomelo中的chat demo

entryHandler.js 中的片段

1.session.on('closed', onUserLeave.bind(null, self.app));
	
2.session.on('closed', function(){
	onUserLeave(self.app,session);
});

var onUserLeave = function(app, session) {
	if(!session || !session.uid) {
		return;
	}
	app.rpc.chat.chatRemote.kick(session, session.uid, app.get('serverId'), session.get('rid'), null);
};
1和2 是等效的

4.caller

caller属性。返回 调用该函数的函数体(反编译代码)

function B() {
    this.x = 2;
    var self = this;
    this.print = function () {
        console.log(self.print.caller  + " .......");
    };
    this.print();//调用者是this ,this指的是function B 所以输出 B的源代码
}
 
b = new B(); // 输出B的代码

5.callee

callee 是arguments.callee  的一个属性,返回当前正在执行的函数体源代码

function B() {
    this.print = function () {
        console.log(arguments.callee  + " .......");
    };
    this.print();
}
b = new B();
Scroll Up