Javascript学习笔记:闭包题解(2)
代码:
var name='The Window';
var object={
name:'My Object',
getNameFunc:function(){
return function(){
return this.name;
};
}
}
console.log(object.getNameFunc()());
问题:请写出该段代码的打印结果。
正确答案:'The Window'
解析:每个函数被调用时都会自动取得两个特殊的变量:this和arguments,内部函数在搜索这两个变量的时候,只会搜索到其活动对象为止,因此永远不可能直接访问外部函数中的这两个变量。因此上面这段代码不存在闭包。所以this.name指向的不是object.name。那this指向的是什么呢?判断函数内部this的指向符合这几条原则:
第一、当函数作为单纯的函数调用时(即该函数不属于某一对象的方法),this指向全局对象,在浏览器中则指向window对象。在Node.js中则指向global对象。
第二、当函数作为某一对象的方法调用时,this指向该对象。
第三、作为构造函数调用时(用new调用),this指向新创建的对象。
第四、当通过call或者apply调用时,this指向call和apply第一个传进来的参数。如果参数为空,则this指向全局对象。
第五、除前四种以外的情况,则this指向全局对象。
由以上这五条判断可知,上面这段代码中的this指向的全局对象,所以this.name的值为'The Window'。如何才能让闭包返回'My Object'呢,可以通过下面这种方式:
var name='The Window';
var object={
name:'My Object',
getNameFunc:function(){
var that=this;
return function(){
return that.name;
};
}
}
console.log(object.getNameFunc()());//My Object
即将包含闭包的函数的this用变量保存起来,然后再在闭包中使用。
arguments也存在和this同样的问题。如果想访问包含函数作用中的arguments或者this,那么必须将this或者arguments对象的引用保存到闭包能够访问到的变量中。
Javascript学习笔记:闭包题解(2)的更多相关文章
- Java程序猿的JavaScript学习笔记(汇总文件夹)
最终完结了,历时半个月. 内容包含: JavaScript面向对象特性分析,JavaScript高手必经之路. jQuery源代码级解析. jQuery EasyUI源代码级解析. Java程序猿的J ...
- Java程序猿的JavaScript学习笔记(8——jQuery选择器)
计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...
- Java程序猿JavaScript学习笔记(2——复制和继承财产)
计划和完成在这个例子中,音符的以下序列: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaSc ...
- Java程序猿的JavaScript学习笔记(3——this/call/apply)
计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...
- Java程序猿JavaScript学习笔记(4——关闭/getter/setter)
计划和完成这个例子中,音符的顺序如下: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScr ...
- Java程序猿JavaScript学习笔记(14——扩大jQuery UI)
计划和完成这个例子中,音符的顺序如下: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScr ...
- javascript学习笔记(四) Number 数字类型
数字格式化方法toFixed().toExponential().toPrecision(),三个方法都四舍五入 toFixed() 方法指定小数位个数 toExponential() 方法 用科学 ...
- JavaScript学习笔记[0]
JavaScript学习笔记[0] 使用的是廖雪峰JavaScript教程. 数据类型 Number 表示数字,不区分浮点整形. === 比较时不转化数据类型. == 反之. NaN与任何值都不想等, ...
- Java程序猿的JavaScript学习笔记(1——理念)
计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...
- Java程序猿的JavaScript学习笔记(10—— jQuery-在“类”层面扩展)
计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...
随机推荐
- object_id用法
特别是在建表建存储过程的时候进场会写到: IF OBJECT_ID('Table_Test','U') IS NOT NULL DROP TABLE Table_Test 这种方式代替了以往所使用的 ...
- Leetcode: Range Addition
Assume you have an array of length n initialized with all 0's and are given k update operations. Eac ...
- opencv,图片遍历
//肤色提取,skinArea为二值化肤色图像 void skinExtract(const Mat &frame, Mat &skinArea) { Mat YCbCr; vecto ...
- poj 1835 宇航员
http://poj.org/problem?id=1835 宇航员 Time Limit: 2000MS Memory Limit: 30000K Total Submissions: 4802 ...
- MS SQL 两种分页
------ row number ---------- ------ row number ---------- declare @pageSize int,@pageIndex int ; sel ...
- diff输出格式解析
1 命令格式 $diff <变动之前的文件> <变动之后的文件> 2 diff文件的三种格式 normal diff context diff unified diff 3 示 ...
- php读取excel内容
使用php读取到excel文件中的内容 1.下载PHPExcel类 2.代码: header("Content-type:text/html;charset=utf-8");req ...
- word record about IR target detecting and tracking
1 is submerged in background clutter 淹没在背景杂波中 2 performe poorly for the dim small targets in sever c ...
- 在Mac中保护私密文件,隐藏文件
在个人电脑中我们有些私密文件或者资料是不希望被人发现或者使用.保护私密文件的方式有很多,比如对文件进行加密,隐藏文件,修改文件后缀等.在Mac中我们也可以通过一些简单方式保护私密文件.这里我们简单介绍 ...
- Oracle安装错误“程序异常终止
Oracle安装错误"程序异常终止.发生内部错误.请将以下文件提供给oracle技术支持部 "程序异常终止.发生内部错误.请将以下文件提供给oracle技术支持部门:" ...