S1:函数上下文
函數(shù)的上下文是可以變化的,因此,函數(shù)內(nèi)的this也是可以變化的,函數(shù)可以作為一個(gè)對(duì)象的方法,也可以同時(shí)作為另一個(gè)對(duì)象的方法,總之,函數(shù)本身是獨(dú)立的。可以通過Function對(duì)象上的call或者apply函數(shù)來修改函數(shù)的上下文:
//定義一個(gè)全局的函數(shù)對(duì)象 function printName(){return this.name; } //設(shè)置printName的上下文為jack, 此時(shí)的this為jack print(printName.call(jack)); //設(shè)置printName的上下文為abruzzi,此時(shí)的this為abruzzi print(printName.call(abruzzi));print(printName.apply(jack)); print(printName.apply(abruzzi));//只有一個(gè)參數(shù)的時(shí)候call和apply的使用方式是一樣的,如果有多個(gè)參數(shù): setName.apply(jack, ["Jack Sept."]); print(printName.apply(jack));setName.call(abruzzi, "John Abruzzi"); print(printName.call(abruzzi));?
?上下文的引用
在前端JavaScript開發(fā)中,一個(gè)常見的錯(cuò)誤是錯(cuò)將this類比為其他的外部局部變量:
$(function(){var con = $("div#panel");this.id = "content";con.click(function(){alert(this.id);//panel }); });
此處的alert(this.id)到底引用著什么值呢?很多開發(fā)者可能會(huì)根據(jù)閉包的概念,做出錯(cuò)誤的判斷:
content
理由是,this.id顯示的被賦值為content,而在click回調(diào)中,形成的閉包會(huì)引用到this.id,因此返回值為content。然而事實(shí)上,這個(gè)alert會(huì)彈出”panel”,究其原因,就是此處的this,雖然閉包可以引用局部變量,但是涉及到this的時(shí)候,情況就有些微妙了,因?yàn)檎{(diào)用對(duì)象的存在,使得當(dāng)閉包被調(diào)用時(shí)(當(dāng)這個(gè)panel的click事件發(fā)生時(shí)),此處的this引用的是con這個(gè)jQuery對(duì)象。而匿名函數(shù)中的this.id = “content”是對(duì)匿名函數(shù)本身做的操作。兩個(gè)this引用的并非同一個(gè)對(duì)象。
如果想要在事件處理函數(shù)中訪問這個(gè)值,我們必須做一些改變:
這樣,我們?cè)谑录幚砗瘮?shù)中保存的是外部的一個(gè)局部變量self的引用,而并非this,這種技巧在實(shí)際應(yīng)用中多有應(yīng)用。
轉(zhuǎn)載于:https://www.cnblogs.com/kuangliu/p/3923707.html
總結(jié)
- 上一篇: PHP调用WebService接口
- 下一篇: Android无线测试之—UiAutom