Javascript 匿名函数与闭包

请见如下一个闭包示例:

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();

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

时间: 2024-12-17 17:40:03

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

JavaScript匿名函数和闭包

概述 在JavaScript前端开发中,函数与对其状态即词法环境(lexical environment)的引用共同构成闭包(closure).也就是说,闭包可以让你从内部函数访问外部函数作用域.在JavaScript,函数在每次创建时生成闭包.匿名函数和闭包可以放在一起学习,可以加深理解.本文主要通过一些简单的小例子,简述匿名函数和闭包的常见用法,仅供学习分享使用,如有不足之处,还请指正. 普通函数 普通函数由fucntion关键字,函数名,() 和一对{} 组成,如下所示: 1 functi

javascript匿名函数与闭包

匿名函数是相对于有名字的函数 如function setAge(){}函数名为setAge 而类似于function(){}则就是一个匿名函数 有名字的函数执行时可以写成setAge(),而没有名字的函数则执行要写成(function())(); 另一种方式是把匿名函数赋值给一个变量来使用 var a=function(){ alert("hello,world"); } a(); 匿名函数传参 (function(age){ return age; })(100); 匿名函数产生闭包

详谈JavaScript 匿名函数及闭包

1.匿名函数函数是JavaScript中最灵活的一种对象,这里只是讲解其匿名函数的用途.匿名函数:就是没有函数名的函数. 1.1 函数的定义,首先简单介绍一下函数的定义,大致可分为三种方式 第一种:这也是最常规的一种 function double(x){    return 2 * x;   } 第二种:这种方法使用了Function构造函数,把参数列表和函数体都作为字符串,很不方便,不建议使用. var double = new Function('x', 'return 2 * x;');

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

代码如下: (function(){ //这里忽略jQuery所有实现 })(); (function(){ //这里忽略jQuery所有实现 })(); 半年前初次接触jQuery的时候,我也像其他人一样很兴奋地想看看源码是什么样的.然而,在看到源码的第一眼,我就迷糊了.为什么只有一个匿 名函数又没看到运行(当然是运行了……),就能有jQuery这么个函数库了?于是,我抱着疑问来到CSDN.结果相信现在很多人都很清楚了(因为在我之 后也不乏来者,呵呵~).当一个匿名函数被括起来,然后再在后面加

浅谈JavaScript匿名函数与闭包

一. 匿名函数 //普通函数定义: //单独的匿名函数是无法运行的.就算运行了,也无法调用,因为没有名称. 如: function(){ alert('123'); }                        //语法错误,无法执行 1.简单的使用: var box =  function(){ return 'Lee'; } alert (box());        //需要调用box()方法. 2.通过自我执行来执行匿名函数 (function(){                /

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

jQuery片段: [javascript] view plaincopyprint? (function(){ //这里忽略jQuery所有实现 })(); (function(){//这里忽略jQuery所有实现})(); 半年前初次接触jQuery的时候,我也像其他人一样很兴奋地想看看源码是什么样的.然而,在看到源码的第一眼,我就迷糊了.为什么只有一个匿名函数又没看到运行(当然是运行了……),就能有jQuery这么个函数库了?于是,我抱着疑问来到CSDN.结果相信现在很多人都很清楚了(因为

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

jQuery片段: [javascript] view plaincopy (function(){ //这里忽略jQuery所有实现 })(); 半年前初次接触jQuery的时候,我也像其他人一样很兴奋地想看看源码是什么样的.然而,在看到源码的第一眼,我就迷糊了.为什么只有一个匿名函数又没看到运行(当然是运行了……),就能有jQuery这么个函数库了?于是,我抱着疑问来到CSDN.结果相信现在很多人都很清楚了(因为在我之后也不乏来者,呵呵~).当一个匿名函数被括起来,然后再在后面加一个括号,这

javascript匿名函数之闭包3

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="en"> <head> <meta http-equiv="Content-Type"

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

网上很多解释,我无法理解,我想知道原理...这篇文章应该可以透彻一点Query片段:view plaincopy to clipboardprint? (function(){      //这里忽略jQuery所有实现      })(); 半年前初次接触jQuery的时候,我也像其他人一样很兴奋地想看看源码是什么样的.然而,在看到源码的第一眼,我就迷糊了.为什么只有一个匿 名函数又没看到运行(当然是运行了--),就能有jQuery这么个函数库了?于是,我抱着疑问来到CSDN.结果相信现在很多