资讯专栏INFORMATION COLUMN

几道JS闭包题目

joy968 / 746人阅读

摘要:每个函数在被调用时都会自动取得两个特殊变量和。把外部作用域中的对象保存在一个闭包能够访问到的变量中,就可以让闭包访问该对象了这个函数会返回一个函数数组,表面上看,每个函数都应该返回自己的索引值,但实际上每个函数都返回。

function fun(n,o) {
   console.log(o);
   return {
      fun:function(m){
      return fun(m,n);
    }
  };
}


三个fun函数是一样的吗?


第一个fun是具名函数,可通过fun.name得到"fun",即函数名;返回值是一个对象字面量表达式,属于一个新的Object;

对象字面量里有一个叫fun的属性,该属性是一个匿名函数表达式,属于新创建的函数,所以第一个和第二个fun函数是不一样的;

匿名函数表达式又返回一个fun函数,我们可以知道这个函数肯定不是新创建的,那么它是指的第一个还是第二个呢?

这就涉及到函数作用域链的问题了。

全局环境中有一个函数fun(),fun()的局部环境中没有变量,所以第三个fun在局部环境中查询不到,就会向上查找,即在全局环境中找到。

所以第三个和第一个是同一个。

var name = "The Window";
var object = {
    name: "My Object";
    getName: function(){
        return function(){
            return this.name;
        };
    }
};
alert(object.getName()()); //"The Window"

每个函数在被调用时都会自动取得两个特殊变量:this和arguments。内部函数在搜索这两个变量时,只会搜索到其活动对象为止,因此永远不可能直接访问到外部函数中的这两个变量。

var name = "The Window";
var object = {
    name: "My Object";
    getName: function(){
        var that = this;  //把外部作用域中的this对象保存在一个闭包能够访问到的变量中,就可以让闭包访问该对象了
        return function(){
            return this.name;
        };
    }
};
alert(object.getName()()); //"My Object"

function createFunction(){
    var result = new Array();
    
    for(var i=0;i<10;i++){
        result[i] = function(){
            return i;
        };
    }
    
    return result;
}

这个函数会返回一个函数数组,表面上看,每个函数都应该返回自己的索引值,但实际上每个函数都返回10。因为每个函数的作用域链中都保存这createFunction()函数的活动对象,所以它们引用的都是同一个变量i。当createFunction()函数返回后,变量i的值是10,此时每个函数都引用者保存变量i的同一个变量对象,所以在每一个函数内部i的值都是10.

function createFunction(){
    var result = new Array();
    
    for(var i=0;i<10;i++){
        result[i] = function(num){
            return function(){
                return num;
            };
        }(i);
    }
    
    return result;  //可以返回各自不同的数值了
}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/80474.html

相关文章

  • 闭包及跨域相关几道

    摘要:题目一题目什么是闭包,为什么要用它网址博客题目二题目的实现原理网址题目三题目是什么的交互模型同步和异步的区别如何解决跨域问题网址题目四题目如何解决跨域问题网址题目五题目原生封装处理兼容网址 题目一:题目:什么是闭包(closure),为什么要用它?网址:http://bbs.daxiangclass.com/?...博客:https://www.jianshu.com/p/6fa......

    idealcn 评论0 收藏0
  • 开开心心做几道JavaScript机试题 - 01

    摘要:碰到这种面试官,你只有是个题霸,再加上眼缘够才能顺利入围。只要按照我题目的思路,甚至打出来测试用例看看,就能实现这个题目了。答案根据的,对答案做出修正。另我的答案绝不敢称最佳,随时欢迎优化修正。但了解总归是好的。 我们在长期的面试过程中,经历了种种苦不堪言,不诉苦感觉不过瘾(我尽量控制),然后主要聊聊常见JavaScript面试题的解法,以及面试注意事项 忆苦 面试第一苦,面试官的土 ...

    liujs 评论0 收藏0
  • 前端最强面经汇总

    摘要:获取的对象范围方法获取的是最终应用在元素上的所有属性对象即使没有代码,也会把默认的祖宗八代都显示出来而只能获取元素属性中的样式。因此对于一个光秃秃的元素,方法返回对象中属性值如果有就是据我测试不同环境结果可能有差异而就是。 花了很长时间整理的前端面试资源,喜欢请大家不要吝啬star~ 别只收藏,点个赞,点个star再走哈~ 持续更新中……,可以关注下github 项目地址 https:...

    wangjuntytl 评论0 收藏0
  • 通过几道题目学习二叉搜索树

    摘要:根据这个特征,用二分法来将有序数组转换为一颗二叉搜索树。边界条件向下取整得到中间值递归二分法接下来我们验证下一棵树是否满足二叉搜索树。二验证二叉搜索树相关题目验证二叉搜索树中等思路就是,中序遍历如果满足递增的就行。 二叉树大家都知道,二叉搜索树满足以下特征: 节点的左子树只包含小于当前节点的数节点的右子树只包含大于当前节点的数 所有左子树和右子树自身必须也是二叉搜索树 二叉搜索树也叫...

    Steven 评论0 收藏0
  • 让我印象深刻的javascript面试题

    摘要:前言对于一个前端来说,面试的时候,难免会遇到的面试题。有几道面试题,有些是我面试遇到的,有些是在网上看到的,但是都印象深刻。 1.前言 对于一个web前端来说,面试的时候,难免会遇到javascript的面试题。就我自己而言。有几道面试题,有些是我面试遇到的,有些是在网上看到的,但是都印象深刻。今天就来简单分析一下我遇到的,印象深刻的一些面试题!主要目的希望能让小伙伴学到一些东西,如过...

    Pink 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<