JS笔记-this的各种用法
2015-06-05 17:01
645 查看
在面向对象编程语言中,在就出现了this对象。在Javascript中,也有this对象,但情况就相比复杂多了。
一般地说,this对象引用的是函数据以执行的环境对象。
坊间传言:this就是指向最近的对象。谁是对象而且离this最近,this就指向谁。这个是很表层的说法。
而深层的说法,指的是:this指针代表的是执行当前代码的对象的持有者。
比如以下代码:
或者大家会以为结果是I am sayHi。但是实际上是I am window,意味着this指向的是window对象。
我认为大家先要了解什么叫做环境对象。在我的理解里,环境对象指的是:在a环境下执行函数,a即为函数的环境对象。上面sayHi函数,实际上是在window对象中执行的,因此this调用的也是window对象中的变量hi。
在下面的情况下,this的指向就变了。
实际上我们可以这样理解:在前一段代码中,执行sayHi()的时候,其实JS内部解释的时候有我们尚未加上的前缀window.。完整的调用应该是:window.sayHi();而第二段代码中则是o.sayHi()。this对象可以说就是指向调用该函数的那个对象,即window和O。
P.S.:在调用this时,并不能认为函数也是一个对象。函数对象并不能在this中占有一席的位置,大家请看下面的代码:
这里的运行结果是:I am window。但是sayHello()是在sayHi()里面执行的啊。大家可以这样想,我们能在JS里用形似sayHi.sayHello()这样的语法吗?答案是不可以的。因此,sayHi在这里也就不算是一个可以被this指向的对象。
一般地说,this对象引用的是函数据以执行的环境对象。
坊间传言:this就是指向最近的对象。谁是对象而且离this最近,this就指向谁。这个是很表层的说法。
而深层的说法,指的是:this指针代表的是执行当前代码的对象的持有者。
比如以下代码:
var hi = "I am window"; function sayHi(){ var hi = "I am sayHi"; alert(this.hi); } sayHi();
或者大家会以为结果是I am sayHi。但是实际上是I am window,意味着this指向的是window对象。
我认为大家先要了解什么叫做环境对象。在我的理解里,环境对象指的是:在a环境下执行函数,a即为函数的环境对象。上面sayHi函数,实际上是在window对象中执行的,因此this调用的也是window对象中的变量hi。
在下面的情况下,this的指向就变了。
var hi = "I am window"; function sayHi(){ var hi = "I am sayHi"; alert(this.hi); } var o = { hi : "I am O" }; o.sayHi = sayHi; o.sayHi(); sayHi();这里的结果是I am O。
实际上我们可以这样理解:在前一段代码中,执行sayHi()的时候,其实JS内部解释的时候有我们尚未加上的前缀window.。完整的调用应该是:window.sayHi();而第二段代码中则是o.sayHi()。this对象可以说就是指向调用该函数的那个对象,即window和O。
P.S.:在调用this时,并不能认为函数也是一个对象。函数对象并不能在this中占有一席的位置,大家请看下面的代码:
var hi = "I am window"; function sayHi(){ var hi = "I am sayHi"; function sayHello(){ alert(this.hi); } sayHello(); } sayHi();
这里的运行结果是:I am window。但是sayHello()是在sayHi()里面执行的啊。大家可以这样想,我们能在JS里用形似sayHi.sayHello()这样的语法吗?答案是不可以的。因此,sayHi在这里也就不算是一个可以被this指向的对象。
相关文章推荐
- JS中判断null、undefined与NaN的方法
- 工作积累(四)——JavaScript深度克隆的实现
- 编写自定义cordova插件(JS)
- JS DateTime 格式化
- 浅谈 JavaScript 编程语言的编码规范
- js 检测页面刷新或关闭
- rails s时报错:Could not find a JavaScript runtime
- json2.js 使用
- [转]JSON与XML的区别比较
- 深入浅出 JavaScript 中的 this
- fastjson 解析
- Underscore.js 中 _.throttle 和 _.debounce 的差异
- JS-underfined is not a function
- js修改后没反应-看看是不是取的缓存
- js中的对象封装
- Javascript-最新手机号码、身份证正则表达式
- jsoup抓取网页报错UnsupportedMimeTypeException
- 通过Ajax post Json类型的数据到Controller
- jsp中的乱码问题
- 译:理解并掌握 JavaScript 中 this 的用法