请见如下一个闭包示例:

color = "red";
var obj = {
color: "blue",
getColor: function () {
function displayColor() {
return this.color;
}
return displayColor();
}
}
console.log(obj.getColor());

在getColor函数内部再定义了一个displayColor,再又定义了一个displayColor函数,从而形成闭包,最后将地上displayColor函数返回,这里发现这样定义其实作用不大,可以使用匿名函数替代直接返回:

color = "red";
var obj = {
color:"blue",
getColor: function () {
return function() {
return this.color;
}
}
}
console.log(obj.getColor()()); //输出 red

闭包中匿名函数和this对象

在javascript 中this 对象是基于函数的执行环境绑定的:在全局函数中, this等于全局环境即 window (浏览器环境)或者globle(node中),而当函数作为某个对象的方法调用时this等于该对象。不过匿名函数的执行环境具有全局性,其this 通常指向window(浏览器)或者globle(node环境),因此上面例子中,输出的是全局对象的 color定义。

为什么没有获得闭包外面定义的blue呢?

如前文所述,函数被调用时,其活动对象会取得两个特殊的变量,arguments和this,因此在搜索的时候在作用域链的最前端即当前活动对象中就查找到了,不会进一步向上层查找。不过我们可以把外部作用域的this对象保存在一个闭包能够访问到的变量里,这样就能够访问外层对象了:

color = "red";
var obj = {
color:"blue",
getColor: function () {
var self=this;
return function() {
return self.color;
}
}
}
console.log(obj.getColor()()); //输出 blue

最后,看一道百度2015年 前端开发南京站笔试题:

var myObject = {
foo: "bar",
func: function() {
var self = this;
console.log("outer func: this.foo = " + this.foo); //输出 bar
console.log("outer func: self.foo = " + self.foo); //输出 bar
(function() {
console.log("inner func: this.foo = " + this.foo); //输出 undefined
console.log("inner func: self.foo = " + self.foo); //输出 bar
}());
}
};
myObject.func();

问,输出结果是什么? 相信现在应该比较好理解了。

Javascript 匿名函数与闭包的更多相关文章

  1. 第一百一十节,JavaScript匿名函数和闭包

    JavaScript匿名函数和闭包 学习要点: 1.匿名函数 2.闭包 匿名函数就是没有名字的函数,闭包是可访问一个函数作用域里变量的函数.声明:本节内容需要有面向对象和少量设计模式基础,否则无法听懂 ...

  2. [从jQuery看JavaScript]-匿名函数与闭包(Anonymous Function and Closure)【转】

    (function(){ //这里忽略jQuery所有实现 })(); 半年前初次接触jQuery的时候,我也像其他人一样很兴奋地想看看源码是什么样的.然而,在看到源码的第一眼,我就迷糊了.为什么只有 ...

  3. 浅谈JavaScript匿名函数与闭包

    一. 匿名函数   //普通函数定义: //单独的匿名函数是无法运行的.就算运行了,也无法调用,因为没有名称. 如: function(){             alert('123');    ...

  4. 深入理解javascript 匿名函数和闭包

    代码如下: (function(){ //这里忽略jQuery所有实现 })(); (function(){ //这里忽略jQuery所有实现 })();  半年前初次接触jQuery的时候,我也像其 ...

  5. [从jQuery看JavaScript]-匿名函数与闭包

    jQuery片段: (function(){ //这里忽略jQuery所有实现 })(); 半年前初次接触jQuery的时候,我也像其他人一样很兴奋地想看看源码是什么样的.然而,在看到源码的第一眼,我 ...

  6. 详谈JavaScript 匿名函数及闭包

    1.匿名函数函数是JavaScript中最灵活的一种对象,这里只是讲解其匿名函数的用途.匿名函数:就是没有函数名的函数. 1.1 函数的定义,首先简单介绍一下函数的定义,大致可分为三种方式 第一种:这 ...

  7. javascript 匿名函数及闭包----转载

    网上很多解释,我无法理解,我想知道原理...这篇文章应该可以透彻一点Query片段:view plaincopy to clipboardprint? (function(){      //这里忽略 ...

  8. [从jQuery看JavaScript]-匿名函数与闭包(Anonymous Function and Closure)

    http://blog.csdn.net/natineprince/article/details/4759533   jQuery片段: (function(){ //这里忽略jQuery所有实现 ...

  9. javascript匿名函数及闭包深入理解及应用

    1.匿名函数 函数是JavaScript中最灵活的一种对象,这里只是讲解其匿名函数的用途.匿名函数:就是没有函数名的函数. 1.1 函数的定义,首先简单介绍一下函数的定义,大致可分为三种方式 第一种: ...

随机推荐

  1. postgresql-pg_prewarm数据预加载。

    pg_prewarm数据预加载. http://francs3.blog.163.com/blog/static/405767272014419114519709/   https://www.kan ...

  2. golang 并发顺序输出数字

    参考 package main import ( "fmt" "sync/atomic" "time" ) func main() { va ...

  3. POJ 2887

    #include <iostream> #include <string> #define MAXN 2000 using namespace std; struct node ...

  4. vue教程3-06 vue路由嵌套(多层路由),路由其他信息

    多层嵌套: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...

  5. Delphi:程序自己删除自己,适用于任何windows版本(含源码)

    Delphi:程序自己删除自己,适用于任何windows版本(含源码) function Suicide: Boolean; var   sei: TSHELLEXECUTEINFO;   szMod ...

  6. (转)Python 实现双向链表(图解)

    原文:https://blog.csdn.net/qq490691606/article/details/49948263 Python 实现双向链表(图解)双向链表双向链表也叫双链表,是链表的一种, ...

  7. mybatis随笔二之SqlSessionFactory

    在上一篇文章我们已经得到了DefaultSqlSessionFactory @Override public SqlSession openSession() { return openSession ...

  8. 【原创】基于Bootstrap的Modal二次封装

    前言 Bootstrap:Twitter推出的一个开源的用于前端开发的工具包.它由Twitter的设计师Mark Otto和Jacob Thornton合作开发,是一个CSS/HTML框架 官方网站: ...

  9. 从nsq中学习如何优雅的退出go 网络程序

    退出运行中的程序,可以粗暴的kill -9 $PID,但这样会破坏业务的完整性,有可能一个正在在执行的逻辑半途而费,从而产生不正常的垃圾数据. 本文总结在go语言中,如何能优雅的退出网络应用,涉及的知 ...

  10. (转)注解用法详解—@@SuppressWarnings

    一.前言 编码时我们总会发现如下变量未被使用的警告提示: 上述代码编译通过且可以运行,但每行前面的“感叹号”就严重阻碍了我们判断该行是否设置的断点了.这时我们可以在方法前添加 @SuppressWar ...