JavaScript之call模擬實現javascript
var obj = { value : 1 } function foo(){ console.log(this.value) } foo.call(obj)
注意:java
var obj = { value :1, foo : function(){ console.log(this.value) } } obj.foo()
這個時候this就指向了obj數組
以上個例子爲例,就是:函數
// 第一步 obj.fn=foo // 第二步 obj.fn() // 第三步 deleteobj.fn
按照這個思路,嘗試寫初版call2函數this
Function.prototype.call2 = function(context){ context.fn=this context.fn() delete context.fn } var obj = { value : 2 } function foo(){ console.log(this.value) } foo.call2(obj)
var obj = { value : 1 } function foo(name,age){ console.log(name)// hy console.log(age)// 18 console.log(this.value)// 1 } foo.call(obj,'hy',18)
注意: 傳入的參數不肯定,該怎麼辦!spa
var args = [] for(let i=1; i<arguments.length; i++) { args.push('arguments['+i+']'); }
不定長的參數問題解決了,咱們接着要把這個參數數組放到要執行的函數的參數裏面去。prototype
eval('context.fn('+ args +')')
第二版代碼以下:code
Function.prototype.call2 = function(context){ context.fn=this var args = [] for(let i=1; i<arguments.length; i++) { args.push('arguments['+i+']'); } eval('context.fn('+args+')'); delete context.fn } var obj = { value :2 } function foo(name,age){ console.log(name) console.log(age) console.log(this.value) } foo.call2(obj,'hy',18)
模擬實現第三步對象
var value = 1 function foo(){ console.log(this.value) } foo.call(null)// 1
2. 函數是能夠有返回值的ip
var obj = { value :1 } function foo(name,age){ return{ value : this.value, name : name, age : age } } console.log(foo.call(obj,'hy',18))// { value: 1, name: 'hy', age: 18 }
到目前爲止已經完成了 call 的模擬
Function.prototype.call2 = function(context){ context.fn=this var args = [] for(leti=1;i<arguments.length;i++) { args.push('arguments['+i+']'); } var result = eval('context.fn('+args+')'); delete context.fn return result } var obj = { value : 2 } function foo(name,age){ return{ value : this.value, name : name, age : age } } console.log(foo.call2(obj,'hy',18))