JavaScript this 局部变量全局变量 作用域 作用域链 闭包
从阮老师博客的一道测试题说起:
代码段一:
var name = "The Window";
var object = {
name : "My Object",
getNameFunc : function(){
return function(){
return this.name;
};
}
};
alert(object.getNameFunc()());
代码段二:
var name = "The Window";
var object = {
name : "My Object",
getNameFunc : function(){
var that = this;
return function(){
return that.name;
};
}
};
alert(object.getNameFunc()());
这两段代码是为了巩固javascript中闭包的用法,但是如果不了解javascript中this的用法的话,很难理解这两段代码的真正意思。
从这个例子入手,首先了解javascript中this的指向。
This
1、this的指向是由它所在函数调用的上下文决定的,而不是由它所在函数定义的上下文决定的;
2、当一个函数作为函数而不是方法来调用的时候,this指向的是全局对象,反之this指向方法前的对象(也就是说当出现 [对象].[函数名] 时,this指向是[对象])。
demo1:指向方法前的对象
     var obj = {
         x:20,
         f:function(){console.log(this.x);}
      };
      obj.f();  //输出20,f()前有obj对象所以this指向obj
      obj.innerobj = {
         x:30,
         f:function(){console.log(this.x);}
      }
      obj.innerobj.f(); //输出30 注:此时当出现多个 . 时,要看最后函数前的 . 本例中为obj.innerobj.
demo2:指向全局对象
/*example 2*/
var x = 10;
var obj = {
x:20,
f:function(){
console.log(this.x);
var foo = function(){
console.log(this.x);
}
foo();
}
}; obj.f(); //输出20和10 在执行f函数中的foo()函数时,由于foo()前没有对象名,故默认为全局对象,输出10 /*example 3*/
var x = 10;
var obj = {
x:20,
f:function(){
console.log(this.x);
}
}; obj.f(); //输出20 var fOut = obj.f;
fOut(); //输出10 fOut()前没有对象名,所以默认为全局变量 var obj2 = {
x:30,
f:obj.f
} obj2.f(); //输出30 f()前对象时obj2,故this指向obj2
3、this指向利用call或apply所指派给this的对象
有时候我们需要人为的修改this指向,那么我们就需要用到call或者apply具体用法如下:
(A对象).函数名.call(B对象,参数1,参数2,参数3,......);//使用此方法函数this指向B对象(若B对象为空则指向全局对象) (A对象).函数名.apply(B对象,[参数1,参数2,参数3,......]);//使用此方法函数this指向B对象,且参数通过数组传递(若B对象为空则指向全局对象)
不多说看例子:
/*example 4*/
var obj = {
x:20,
f:function(){
console.log(this.x);
}
}; var obj2 = {
x:30
}; obj.f.call(obj2); //输出30而不是obj中的20 因为使用了call();
4、this指向new所产生的新对象
即:当函数当做构造函数来使用时,函数内部的this则指向于new出的新对象。
function Student(){
           this.name="Leon";
           this.sex = "male";
           this.age=20;
       };
       var stu = new Student();
       console.log(stu.sex);  //输出male Student()中this指向了stu 故赋值给new出的stu对象
5、callback函数内的this会指向于,调用放入该callback的函数的this所指向的对象
作用域链
JavaScript this 局部变量全局变量 作用域 作用域链 闭包的更多相关文章
- JavaScript高级内容笔记:原型链、继承、执行上下文、作用域链、闭包
		最近在系统的学习JS深层次内容,并稍微整理了一下,作为备忘和后期复习,这里分享给大家,希望对大家有所帮助.如有错误请留言指正,tks. 了解这些问题,我先一步步来看,先从稍微浅显内容说起,然后引出这些 ... 
- JavaScript函数之作用域 / 作用链域 / 预解析
		关于作用域和作用链域的问题,很多文章讲的都很详细,本文属于摘录自己觉得对自己有价值的部分,留由后用,仅供参考,需要查看详细信息请点击我给出的原文链接查看原文件 做一个有爱的搬运工~~ -------- ... 
- 作用域&作用域链和with,catch语句&闭包
		作用域(函数) 作用域:变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期; 在一些类C编程语言中花括号内的每一段代码都有各自的作用域,而且变量在声明它们的代码段外是不可见的,称之为块 ... 
- 深入理解javascript中执行环境(作用域)与作用域链
		深入理解javascript中执行环境(作用域)与作用域链 相信很多初学者对与javascript中的执行环境与作用域链不能很好的理解,这里,我会按照自己的理解同大家一起分享. 一般情况下,我们把执行 ... 
- js原型链闭包作用域链-Tom
		1.原型相当于Java.C++里面的父类,由封装公有属性及方法而产生,子类可以继承. 原型继承实现(函数的原型属性指向原型函数一个实例对象,函数的原型的构造函数指向函数本身) 1)eg:原型链 fun ... 
- Javascript的那些硬骨头:作用域、回调、闭包、异步……
		终于到了神话破灭的时刻-- 这注定是一篇"自取其辱"的博客,飞哥,你们眼中的大神,Duang,这次脸朝下摔地上了. 故事得从这个求助开始:e.returnValue 报错:未定义, ... 
- 作用域 作用域链 闭包 思想 JS/C++比较
		首先,我说的比较是指JS中这种思想/实现方式与C++编译原理中思想/实现方式的比较 参考链接:(比较易懂的介绍,我主要写个人理解) 作用域链: http://www.cnblogs.com/dolph ... 
- 《你不知道的JavaScript》第一部分:作用域和闭包
		第1章 作用域是什么 抛出问题:程序中的变量存储在哪里?程序需要时,如何找到它们? 设计 作用域 的目的:为了更好地存储和访问变量. 作用域:根据名称查找变量的一套规则,用于确定在何处以及如何查找变量 ... 
- JavaScript之作用域-作用域链
		作用域 ==> 作用域链 作用域:变量可以其作用的区域(声明定义好一个变量,变量可以在哪些范围内使用) 分类:全局作用域和局部作用域(函数作用域):在js中,目前全局有作用域以及函数可以形成 ... 
随机推荐
- 火狐Firefox 浏览器 onblur() 并且alert()时文本被选中问题
			说明:镜像是组成在线实验课程的基础环境,教师设计的实验绑定一个或多个镜像,就组成了一讲独立的在线实验课程. 镜像名称: 火狐Firefox 浏览器 onblur() 并且alert()时文本被 ... 
- [Mugeda HTML5技术教程之15]案例分析:制作移动教育课件
			本文档要分析的案例是一个一氧化碳还原氧化铜的教育小课件,从中可以体会一些Mugeda API的用法和使用Mugeda动画制作移动教育课件的方法.Mugeda为移动教育领域和移动数字出版领域提供理想的教 ... 
- python time模块函数
			# -*-coding=utf-8 -*- __author__ = 'piay' import time def get_struct_time(): ''' 可以使用list或者字符串格式化 tm ... 
- 正式学习React(五) react-redux源码分析
			磨刀不误砍柴工,咱先把react-redux里的工具函数分析一下: 源码点这里 shallowEqual.js export default function shallowEqual(objA, ... 
- 不要怂,就是GAN (生成式对抗网络) (二)
			前面我们了解了 GAN 的原理,下面我们就来用 TensorFlow 搭建 GAN(严格说来是 DCGAN,如无特别说明,本系列文章所说的 GAN 均指 DCGAN),如前面所说,GAN 分为有约束条 ... 
- Dijkstra算法C#实现及其布线运用
			大家好,我是小鸭酱,博客地址为:http://www.cnblogs.com/xiaoyajiang 以下是空调布线对Dijkstra算法的运用,采用C#实现. 问题:室内机多台,室外机一台.寻找室内 ... 
- qt捕获全局windows消息(使用QAbstractNativeEventFilter,然后注册这个类)
			qt 如何捕获全屏的鼠标事件,这个帖子上面主要讲述了下嵌入式qt怎么抓取系统级消息,不过从这篇文章中我也看到了希望,有个回复说winEventFilter支持这种方式,然后我就顺着这个线索找到了na ... 
- PostgreSQL与MySQL比较(转)
			Mysql 使用太广泛了,以至于我不得不将一些应用从mysql 迁移到postgresql, 很多开源软件都是以Mysql 作为数据库标准,并且以Mysql 作为抽象基础的,但是具体使用过程中,发现M ... 
- 决策树之ID3算法实现(python)
			决策树的概念其实不难理解,下面一张图是某女生相亲时用到的决策树: 基本上可以理解为:一堆数据,附带若干属性,每一条记录最后都有一个分类(见或者不见),然后根据每种属性可以进行划分(比如年龄是>3 ... 
- Python多线程(threading模块)
			线程(thread)是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务. ... 
