匿名函数里的this的执行环境和指向--javascript
重新看了下闭包,在javascript高级程序设计第二版里的闭包里有如下例子,例子中介绍说匿名函数的执行环境具有全局性和this指向window,对于这句话很费解,所以就想个方法验证下。
var name = "The Window";
var object = {
name : "My Object",
getNameFunc : function(){
return function(){
return this.name;
};
}
};
alert(object.getNameFunc()());输出 The Window
一.匿名函数的执行环境具有全局性,因此其this对象通常指向window,也可以称的上是window对象的方法的验证
var a = 100;
(function () {
console.log(a);
console.log(this.a);
console.log(window.a);
})()
输出
100
100
100
(function () {
this.a = 200;
})();
console.log(window.a);
console.log(this.a);
console.log(a);
输出
200
200
200
上面两个例子验证了匿名函数的上下文环境是window
二.将闭包的题改一下来验证匿名函数的this
var object = {
name : "My Object",
getNameFunc : function(){
return function(){
if (this===window)
{return "匿名函数的上下文环境是window";}
else
{return "匿名函数的上下文环境不是window";};
};
}
};
alert(object.getNameFunc()());
//输出 匿名函数的上下文环境是window
三.下面是从网上看的一篇文章上的代码
function foo() {
if (this===window) {
document.write("call a function");
}
else{
document.write("call a function or method");
}
}
function MyObject(name) {
// 下面的this指代new关键字新创建实例
this.name = name;
this.foo = function(){
document.write("call a method, by object: ", this.name, " ; and then ");
foo();
};
}
var obj1 = new MyObject("obj1");
var obj2 = new MyObject("obj2");
// 测试1: 作为函数调用
foo(); //Output=>call a function.
// 测试2: 作为对象方法的调用
obj1.foo(); //Output=>call a method, by object: obj1 ; and then call a function.
obj2.foo(); //Output=>call a method, by object: obj2 ; and then call a function.
// 测试3: 将函数作为“指定对象的”方法调用
foo.call(obj1); //Output=>call a function or method.
foo.apply(obj2); //Output=>call a function or method.
全局foo()函数也是方法,它其实是其上下文环境(window)的方法
参考:
http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html
http://www.ibm.com/developerworks/cn/web/1207_wangqf_jsthis/
匿名函数里的this的执行环境和指向--javascript的更多相关文章
- python 匿名函数捕获变量值 (执行时的值)
- Javascript的匿名函数与自执行
1.匿名函数 函数是JavaScript中最灵活的一种对象,这里只是讲解其匿名函数的用途.匿名函数:就是没有函数名的函数. 1.1 函数的定义,首先简单介绍一下函数的定义,大致可分为三种方式 第一种: ...
- Javascript 函数及其执行环境和作用域
函数在javascript中可以说是一等公民,也是最有意思的事情,javascript函数其实也是一个对象,是Function类型的实例.因此声明一个函数首先可以使用 Function构造函数: va ...
- JavaScript基础---作用域,匿名函数和闭包
匿名函数就是没有名字的函数,闭包是可访问一个函数作用域里变量的函数. 一.匿名函数 //普通函数 function box() { //函数名是 box return 'TT'; } //匿名函数 f ...
- JavaScript基础---作用域,匿名函数和闭包【转】
匿名函数就是没有名字的函数,闭包是可访问一个函数作用域里变量的函数. 一.匿名函数 //普通函数 function box() { //函数名是 box return 'TT'; } //匿名函数 f ...
- 第一百一十节,JavaScript匿名函数和闭包
JavaScript匿名函数和闭包 学习要点: 1.匿名函数 2.闭包 匿名函数就是没有名字的函数,闭包是可访问一个函数作用域里变量的函数.声明:本节内容需要有面向对象和少量设计模式基础,否则无法听懂 ...
- 浅谈JavaScript匿名函数与闭包
一. 匿名函数 //普通函数定义: //单独的匿名函数是无法运行的.就算运行了,也无法调用,因为没有名称. 如: function(){ alert('123'); ...
- JavaScript(第十五天)【匿名函数和闭包】
学习要点: 1.匿名函数 2.闭包 匿名函数就是没有名字的函数,闭包是可访问一个函数作用域里变量的函数.声明:本节内容需要有面向对象和少量设计模式基础,否则无法听懂.(所需基础15章的时候已经声明 ...
- javascript 作用域链及闭包,AO,VO,执行环境
下面的文章内容会根据理解程度不断修正. js变量作用域: 定义:变量在它申明的函数体以及函数体内嵌套的任意函数体内有定义. function AA(){ var bb='我是AA内部变量'; func ...
随机推荐
- System services not available to Activities before onCreate()
应用中涉及到系统的mac地址获取,应该是不能够在oncreate()以前使用
- 忘了SA密码的SQL SERVER
[暂时还未验证] SQL2008 如果 本地连接登录补上,也忘了Sa等管理账号的密码,可以通过单用户连接的方式登录 http://msdn.microsoft.com/zh-cn/library/m ...
- L4,an exciting trip
expressions: a great number of 许多 in the centre of 在…的中部 sentences: I have just had breakfast. I hav ...
- Android内存性能优化(内部资料总结) 转
刚入门的童鞋肯能都会有一个疑问,Java不是有虚拟机了么,内存会自动化管理,我们就不必要手动的释放资源了,反正系统会给我们完成.其实Java中没有指针的概念,但是指针的使用方式依然存在,一味的依赖系统 ...
- 关于java.lang.reflect.InvocationTargetException(jar 包缺少或者冲突)的错误
我在合肥那边运行了的是湖北石首市的项目没有错 可是回武汉之后 运行这个项目 点击这里的时候 就报错java.lang.reflect.InvocationTargetException 不是数据库 ...
- 【栈】 poj 1363
poj1363,这道题是数据结构与算法中的经典问题,给定一组进栈顺序,问栈有多少种出去的顺序. #include<stdio.h> #include <stack> #incl ...
- hudson配置教程
Hudson配置教程 hudson是个优 秀的开源工具,可惜是小日本开发的.这点不爽.拿过来用吧.我们公司(Qisda)的用途是 用来晚上定时的抓Android的代码,然后编译,保存img文件,然后根 ...
- 面向对象的JS代码
在下面的例子中可以找到强类型语言中所描述的类,属性,方法,对象. <script language="javascript" type="text/javascri ...
- 64位系统访问注册表SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
public int ChecNonkWoW64() { try { ; string subKey = @"SOFTWARE\Microsoft\Windows\CurrentVersio ...
- SpringMVC文件上传报错org.apache.catalina.connector.RequestFacade cannot be cast to org.springframework.web.multipart.MultipartHttpServletRequest
错误信息: java.lang.ClassCastException: org.apache.catalina.connector.RequestFacade cannot be cast to or ...