JavaScript - this详解 (一)
侃侃JavaScript
中的this
this
为何如此多变?
this总是跟它的执行上下文有关,而在JavaScript总会有开辟新的执行上下文的东西,比如函数,所以,this才如此的变化。
执行环境对
JavaScript
中的this
有影响吗?
JavaScript是一门解释型语言,需要有一个执行环境去执行它,通常的执行环境是浏览器,还有node脚本,还有`REPL`(“读取-求值-输出”循环(Read-Eval-Print Loop,简称REPL))。
如果对REPL有兴趣的话,博客中的另一篇文章介绍了`REPL`
this
默认指代谁?
在不同的执行环境中,会指代不同的对象
浏览器中:
> this // Window {top: Window, window: Window,...
> this === window //true
> var a = 1; //在全局中,用var声明变量,会默认给window添加
> this.a // 1
> window.a // 1
> b = 1; //不使用var声明变量,会默认给全局的this添加属性> this.b // 1
> window.b // 1
在node
脚本中
console.log(this); //{}
console.log(this === global); //false
console.log(this === window); //ReferenceError: window is not defined
var a = 1; //在全局中,使用var声明变量,未给global添加属性
console.log(this.a); //undefined
console.log(global.a); //undefined
console.log(window.a); //ReferenceError: window is not defined
b = 1; //不使用var声明变量,会默认给全局的global添加属性。
console.log(this.b); //undefined
console.log(global.b); // 1
在node脚本中,this默认指向一个空对象,并不是指向global,也不是指向window。
在REPL
中
> this
{ DTRACE_NET_SERVER_CONNECTION: [Function],
DTRACE_NET_STREAM_END: [Function],
...
> global === this //true
> var a = 1; //在全局中,使用var声明变量,会默认给全局的global添加属性
> this.a // 1
> global.a // 1
> b = 1; //不使用var声明变量,会默认给全局的this添加属性
> this.b // 1
> global.b // 1
实例扩展
我们对于省略
var
的变量声明方式,我们总说它是不安全的,但是是合法的。
为什么不安全?
如上文所述:不使用var声明变量,会让变量默认的添加到了全局的this中,这有时候会莫名的给变量提升它的作用域,从而影响其他全局变量。
举个栗子:
var position = "outer"; //this.position = "outer"
function test(){
position = "inner"; //this.position = "inner",在函数执行后,覆盖原先的值
console.log(this.position);
}
test();
我们在外部定义了一个名为position
的全局变量,它会被默认添加到全局this的属性上。
然后在我们的test
函数中,又定义了一个同名的变量,但是注意,函数中的变量声明没有用var
。
因为我们并没有对函数实例化,所以this.position
的this
会默认指代全局。
而当我们调用函数test
时,函数会生成一个执行上下文,而内部position
会将作用域从函数内部提升到全局,从而覆盖(污染)了外部全局定义的position
变量。
所以,在JavaScript
的严格模式中,是不允许省略var
来声明变量的。故在声明变量的时候,就顺手加上var
吧。
总结
this
在不同的执行环境中的默认指代通过省略
var
声明变量导致“变量提升”现象的发生及预防
JavaScript - this详解 (一)的更多相关文章
- JavaScript事件详解-jQuery的事件实现(三)
正文 本文所涉及到的jQuery版本是3.1.1,可以在压缩包中找到event模块.该篇算是阅读笔记,jQuery代码太长.... Dean Edward的addEvent.js 相对于zepto的e ...
- JavaScript事件详解-Zepto的事件实现(二)【新增fastclick阅读笔记】
正文 作者打字速度实在不咋地,源码部分就用图片代替了,都是截图,本文讲解的Zepto版本是1.2.0,在该版本中的event模块与1.1.6基本一致.此文的fastclick理解上在看过博客园各个大神 ...
- JavaScript正则表达式详解(一)正则表达式入门
JavaScript正则表达式是很多JavaScript开发人员比较头疼的事情,也很多人不愿意学习,只是必要的时候上网查一下就可以啦~本文中详细的把JavaScript正则表达式的用法进行了列表,希望 ...
- JavaScript正则表达式详解(二)JavaScript中正则表达式函数详解
二.JavaScript中正则表达式函数详解(exec, test, match, replace, search, split) 1.使用正则表达式的方法去匹配查找字符串 1.1. exec方法详解 ...
- JavaScript事件详解-zepto的事件实现
zepto的event 可以结合上一篇JavaScript事件详解-原生事件基础(一)综合考虑源码暂且不表,github里还有中文网站都能下到最新版的zepto.整个event模块不长,274行,我们 ...
- javascript 函数详解2 -- arguments
今天我们接着上篇文章来继续javascript函数这个主题.今天要讲的是函数对像中一个很重要的属性--arguments. 相关阅读: javascript 函数详解1 -- 概述 javascrip ...
- [原创]JavaScript继承详解
原文链接:http://www.cnblogs.com/sanshi/archive/2009/07/08/1519036.html 面向对象与基于对象 几乎每个开发人员都有面向对象语言(比如C++. ...
- javaScript基础详解(1)
javaScript基础详解 首先讲javaScript的摆放位置:<script> 与 </script> 可以放在head和body之间,也可以body中或者head中 J ...
- javascript设计模式详解之命令模式
每种设计模式的出现都是为了弥补语言在某方面的不足,解决特定环境下的问题.思想是相通的.只不过不同的设计语言有其特定的实现.对javascript这种动态语言来说,弱类型的特性,与生俱来的多态性,导致某 ...
- javascript设计模式详解之策略模式
接上篇命令模式来继续看下js设计模式中另一种常用的模式,策略模式.策略模式也是js开发中常用的一种实例,不要被这么略显深邃的名字给迷惑了.接下来我们慢慢看一下. 一.基本概念与使用场景: 基本概念:定 ...
随机推荐
- 用Theano学习Deep Learning(三):卷积神经网络
写在前面的废话: 出了托福成绩啦,本人战战兢兢考了个97!成绩好的出乎意料!喜大普奔!撒花庆祝! 傻…………寒假还要怒学一个月刷100庆祝个毛线………… 正题: 题目是CNN,但是CNN的具体原理和之 ...
- Python 小知识点(8)-- __new__
第一段代码如下: class Foo(object): def __init__(self,name): self.name = name print("Foo __init__" ...
- 颜色模式中8位,16位,24位,32位色彩是什么意思?会有什么区别?计算机颜色格式( 8位 16位 24位 32位色)<转>
颜色模式中8位,16位,24位,32位色彩是什么意思?会有什么区别简单地说这里说的位数和windows系统显示器设置中的颜色位数是一样的.表示的是能够显示出来的颜色的多少. 8位的意思是说,能够显示出 ...
- Tornado 多进程 & 异步
另外一篇:http://www.cnblogs.com/xiaoshi657/p/6945208.html 基本版: #coding=utf-8 import tornado.web import t ...
- Python格式符说明
格式化输出 例如我想输出 我的名字是xxxx 年龄是xxxx name = "Lucy"age = 17print("我的名字是%s,年龄是%d"%(name, ...
- Mysql 日志文件类型
简介: Mysql 中提供了多种类型的日志文件,分别反映 Mysql 的不同信息,了解它们很有必要. 1.Error log ( 错误日志 ) 错误日志记录了 Mysql Server 运行过程中所有 ...
- 利用Surprise包进行电影推荐
Surprise(Simple Python Recommendation System Engine)是一款推荐系统库,是scikit系列中的一个.简单易用,同时支持多种推荐算法(基础算法.协同过滤 ...
- SaltStack 的插件特性
:first-child { margin-top: 0; } blockquote > :last-child { margin-bottom: 0; } img { border: 0; m ...
- Android开发实战之底部Dialog弹出效果
在Android开发中,有很多情况下我们需要使用到对话框,遗憾的是,安卓自带的对话框样式不能满足我们实际的需要,所以往往需要我们自定义对话框,具体做法:写一个对话框继承自Dialog实现他的一个构造方 ...
- java程序员应该熟悉的20个有用的库(转)
优秀且经验丰富的Java开发人员的一个特点是API的广泛知识,包括JDK和第三方库.我花了很多时间学习API,特别是在阅读Effective Java 3rd Edition之后,Joshua Blo ...