js考察this,作用域链和闭包
在严格版中的默认的this不再是window,而是undefined。
先看两个例子
example one
var num = 20;
var obj = {
num: 30,
fn: (function() {
this.num *= 3;
num += 15;
var num = 45;
return function() {
this.num *= 4;
num += 20;
console.log(num)
}
})(num)
};
var fn = obj.fn;
fn(); //因此时num是在fn函数定义的是个局部变量,num会自动找在哪里定义的找到初始值再计算,即45+20=65
obj.fn(); //因fn()执行的时候num改变成65了, 65+20=85
example two
var num = 20;
var obj = {
num: 30,
fn: (function() {
this.num *= 3;
console.log(this) //因这里是个自执行函数的
num += 15;
var num = 45;
return function() {
this.num *= 4;
num += 20;
// console.log(this.num)
}
})(num)
};
var fn = obj.fn;
fn(); //因此时this指向window,在自执行函数执行的时候,this.num *= 3;此时window.num = 60,执行fn(),60*4 = 240
obj.fn(); //120 此时this指向obj,this.num = 30, 30*4 = 120
知识点一:this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象
(function(){
//浏览器中this指向window
}());
function a() {
console.log(this)
}
a() //window
知识点二:当this碰到return时
如果函数返回值为常规意义上的值类型(Number、String、Boolean)时,new函数将会返回一个该函数的实例对象,而如果函数返回一个引用类型(Object、Array、Function),则new函数返回改引用类型的对象
function fn()
{
this.name="吴小小"
return {}; //或者 rerurn function(){} 或者 return []
}
var a = new fn;
console.log(a.user); //undefined
function fn()
{
this.name="吴小小"
return undefined; //或者 rerurn null
}
var a = new fn;
console.log(a); //fn {name: "吴小小"}
知识点三 apply call
apply或者call第一个参数是this作用域的指向,第二个以后指的是参数
(function(a){
console.log(this,a)
}).apply(0,[4,3])
// Number 4
(function(a){
console.log(this,a)
}).apply({},[4,3])
// {} 4
(function(a){
console.log(this,a)
}).apply(null,[4,3])
// window 4
(function(a){
console.log(this,a)
}).apply(undefined,[4,3])
// window 4
js考察this,作用域链和闭包的更多相关文章
- JS详细图解作用域链与闭包
JS详细图解作用域链与闭包 攻克闭包难题 初学JavaScript的时候,我在学习闭包上,走了很多弯路.而这次重新回过头来对基础知识进行梳理,要讲清楚闭包,也是一个非常大的挑战. 闭包有多重要?如果你 ...
- 前端高质量知识(四)-JS详细图解作用域链与闭包
攻克闭包难题 初学JavaScript的时候,我在学习闭包上,走了很多弯路.而这次重新回过头来对基础知识进行梳理,要讲清楚闭包,也是一个非常大的挑战. 闭包有多重要?如果你是初入前端的朋友,我没有办法 ...
- js深入(三)作用域链与闭包
在之前我们根绝对象的原型说过了js的原型链,那么同样的js 万物皆对象,函数也同样存在这么一个链式的关系,就是函数的作用域链 作用域链 首先先来回顾一下之前讲到的原型链的寻找机制,就是实例会先从本身开 ...
- 1--面试总结-js深入理解,对象,原型链,构造函数,执行上下文堆栈,执行上下文,变量对象,活动对象,作用域链,闭包,This
参考一手资料:http://dmitrysoshnikov.com/ecmascript/javascript-the-core/中文翻译版本:https://zhuanlan.zhihu.com/p ...
- js之作用域链到闭包
一.作用域 全局作用域和函数作用域(局部作用域). 一个变量的作用域就是源代码中定义这个变量的区域. 二.作用域链和闭包 全局变量只有一个(window,globel),全局环境下每一个函数都会形成一 ...
- 在chrome开发者工具中观察函数调用栈、作用域链与闭包
在chrome开发者工具中观察函数调用栈.作用域链与闭包 在chrome的开发者工具中,通过断点调试,我们能够非常方便的一步一步的观察JavaScript的执行过程,直观感知函数调用栈,作用域链,变量 ...
- 前端基础进阶(六):在chrome开发者工具中观察函数调用栈、作用域链与闭包
在前端开发中,有一个非常重要的技能,叫做断点调试. 在chrome的开发者工具中,通过断点调试,我们能够非常方便的一步一步的观察JavaScript的执行过程,直观感知函数调用栈,作用域链,变量对象, ...
- 个人理解的javascript作用域链与闭包
闭包引入的前提个人理解是为从外部读取局部变量,正常情况下,这是办不到的.简单的闭包举例如下: function f1(){ n=100; function f2(){ alert(n); } retu ...
- 聊一下JS中的作用域scope和闭包closure
聊一下JS中的作用域scope和闭包closure scope和closure是javascript中两个非常关键的概念,前者JS用多了还比较好理解,closure就不一样了.我就被这个概念困扰了很久 ...
- 【进阶2-2期】JavaScript深入之从作用域链理解闭包(转)
这是我在公众号(高级前端进阶)看到的文章,现在做笔记 https://github.com/yygmind/blog/issues/18 红宝书(p178)上对于闭包的定义:闭包是指有权访问另外一 ...
随机推荐
- matplotlib学习笔记
1.简介 matplotlib是python的一个2D绘图库,它可以在不同平台上地使用多种通用的绘图格式(hardcopy formats)和交互环境绘制出出版物质量级别的图片.matplotlib可 ...
- tcpdump抓包常用命令列举
情形一.采集指定网络接口和端口的数据包 sudo tcpdump -s 0 -x -n -tttt -i bond0 port 55944 -w /tmp/mysql_tmp.tcp 情形二.采集 ...
- HTML5全屏浏览器兼容方案
最近一个项目有页面全屏的的需求,搜索了下有HTML5的全屏API可用,不过各浏览器的支持不一样. 标准 webkit Firefox IE Element.requestFullscreen() ...
- Conversation function
通过conversation function可以把类转成任意类型的值 #include <iostream> using namespace std; class Age { priva ...
- C 小白的 thrift 环境搭建
公司有个通讯 是用的 thrift ,thrift 是个什么都东西,可以类比 webservice 吧,比 webservice 高效些,不管是啥,搞他! 先在 mac 上搞本地开发环境 网上一搜 貌 ...
- randint模块无法加载
原因:把程序文件名命名为 random.py 导致 random.randint 加载的是这个文件的模块
- Windows应用程序组成及编程步骤
Windows应用程序组成及编程步骤: 1.应用程序的组成:一个完整的Windows应用程序通常由五种类型的文件组成 1.C语言源程序文件 2.头文件 3.模块定义文件 4.资源描述文件 5.项目文件 ...
- [Web]ORM模式的看法
在看各种语言建站Web资料的时候,无一例外的都使用了ORM的设计模式.一直百思不得其解. 从个人实践来说,ORM带来了更高的学习成本和更低的性能,并且还无法满足复杂的查询需求. 之前一直认为自己在大型 ...
- ant design select placeholder不生效原因
当select的value绑定一个state默认值时,如果默认值是''或null时,placeholder不生效 解决方案:默认值设为undefined
- react_app 项目开发 (2)_axios_pubsub-js
生产环境打包并运行 yarn run build 会src代码进行打包处理,在内存中生成打包文件 将打包文件保存至内存 yarn global add serve serve -s build 将 b ...