結果:javascript
結果:java
總結:
1.當使用 apply和 call去調用函數而且沒有傳遞參數時,前提這個函數中也沒有傳遞參數,咱們發現 他們的打印結果和 this 指向是相同的 都是指向window 此時至關於 f1() 調用函數 就至關於 f1.apply() 和 f1.call()
2.當傳遞 null 的時候,他們的指向也是相同的 都是指向 window
此時至關於 f1() 調用函數 就至關於 f1.apply(null) 和 f1.call(null)數組
結果:app
咱們發現 使用
f1.apply(stu)
和f1.call(stu)
去調用函數的時候,this的指向發生了改變,再也不是 window,而是 Object函數
結果:this
總結:
apply和call沒有傳遞參數,因此沒有進行參數的運算,值是 NaN ,可是他們的this指向並無改變,仍然是 windowprototype
結果:3d
總結:
與不傳參數的結果是同樣的,值是 NaN,而且this 指向沒有改變code
結果:對象
總結:
兩個方法傳入具體對象時,都改變了 this的指向,this 指向不是 window ,而是 Object
思考:
二者都傳入一個對象改變了 this 指向,可是如何去傳入參數進行函數的運算呢???
結果:
總結:
1.apply和call傳入的第一個參數表示 this 指向的對象
2.apply和call能夠傳遞多個參數,只是他們傳遞參數的方式不同
3.apply是以數組的方式傳遞參數的
4.call是以參數列表的方式傳遞參數的,也就是經過一個一個的方式傳遞參數
總結:
1.f1()函數調用時,this的指向是window,而window中沒有定義age這個屬性值,因此是 undefined
2.apply和call都改變了 this 的指向,this 指向了 stu ,stu這個對象中有 age 這個屬性值 ,因此輸出 age = 18
總結:
apply 和 call 都使用變量來接收函數的返回值
function Person(food) { this.food = food } // 經過原型來添加方法 Person.prototype.eat = function (x, y) { console.log('我好想吃 ---->' + this.food) console.log(x + y) } var per = new Person('大豬蹄') per.eat(100, 100) //建立 stu 對象,並添加屬性和方法 console.log('============================') function Student(food) { this.food = food } Student.prototype.study = function () { console.log('禿頭少女的平常操做,每天敲代碼') } var stu = new Student('大雞腿') //改變this指向,讓this指向 stu對象 //能調用 per對象中的方法 per.eat.apply(stu, [200, 200]) //也能調用本身的方法 stu.study()
結果:
apply 的使用方式
函數名字.apply (對象,[參數1,參數2,...])
方法名字.apply (對象,[參數1,參數2,...])
call 的使用方式
函數名字.call (對象,參數1,參數2,...)
方法名字.call (對象,參數1,參數2,...)
做用:改變this 的指向
區別:參數傳遞的方式不同
使用場景:只要是想使用別的對象的方法,而且但願這個方法是當前對象本身的,那麼就能夠使用 apply 或者 call 的方法 改變 this 的指向
結果:
咱們發現,雖然使用了bind 方法,可是它並無輸出內容,因此,要用一個變量接收一下,而後再調用
結果:
還能夠寫成:
function Person(say){ this.say = say } Person.prototype.play = function(x,y){ console.log('作人嘛~~最重要的就是要開心吶!!' + this.say ) console.log(x+y) } var per = new Person('對呢對呢') per.play(10,10) //這是一條華麗的分割線 console.log('==============================================') function Student(say){ this.say = say } Student.prototype.study = function(){ console.log('一根毛,兩根毛,頭上還有幾根毛') } var stu = new Student('撒花撒花') //調用別人的方法 var ff = per.play.bind(stu) ff(20,20) //調用本身的方法 stu.study()
結果:
相同點:
不一樣點: