美文网首页
关于闭包知识的整理

关于闭包知识的整理

作者: 即将有人鱼线的李先森 | 来源:发表于2021-11-25 09:32 被阅读0次


一、创建函数的几种方式

1、声明函数

最普通最标准的声明函数方法,包括函数名及函数体。

function  fn1(){}

2、创建匿名函数表达式

创建一个变量,这个变量的内容为一个函数

var fn1 = function(){}

注意采用这种方法创建的函数为匿名函数,即没有函数name

var fn1 = function (){};

3、创建具名函数表达式

创建一个变量,内容为一个带有名称的函数

var fn1 = function frankName(){};

注意:具名函数表达式的函数名只能在创建函数内部使用

即采用此种方法创建的函数在函数外层只能使用fn1不能使用frankName的函数名。frankName的命名只能在创建的函数内部使用测试:

varfn1=function frankName(){

    console.log("in:fn1<",typeoffn1,">frankName:<",typeof frankName,">");

};

console.log("out:fn1<",typeoffn1,">frankName:<",typeof  frankName,">");

fn1();

//out:fn1< function >frankName:<undefined>//in:fn1< function >frankName:< function >

可以看到在函数外部(out)无法使用frankName的函数名,为undefined。

注意:在对象内定义函数如var o={ fn : function (){…} },也属于函数表达式

4、Function构造函数

可以给Function构造函数传一个函数字符串,返回包含这个字符串命令的函数,此种方法创建的是匿名函数

5、自执行函数

(function(){alert(1);})();

(functionfn1(){alert(1);})();

自执行函数属于上述的“函数表达式”,规则相同

6、其他创建函数的方法

当然还有其他创建函数或执行函数的方法,这里不再多说,比如采用eval,setTimeout,setInterval等非常用方法,这里不做过多介绍,属于非标准方法,这里不做过多展开

二、函数作用域链的问题

问题:在函数表达式内部能不能访问存放当前函数的变量?

测试1,对象内部的函数表达式:

var o = {

 fn:function(){    

console.log(fn);  

}

};

o.fn();//ERROR报错

测试2,非对象内部的函数表达式:

var fn = function(){  console.log(fn);};

fn();

//function (){console.log(fn);};正确

总结:使用var或是非对象内部的函数表达式内,可以访问到存放当前函数的变量;在对象内部的不能访问到。

原因也非常简单,因为函数作用域链的问题,采用var的是在外部创建了一个fn变量,函数内部当然可以在内部寻找不到fn后向上册作用域查找fn,而在创建对象内部时,因为没有在函数作用域内创建fn,所以无法访问。

三、简单的几个代码片段

代码片段一:

var name = "The Window";

var object = {

name : "My Object",

getNameFunc : function(){

return function(){

return this.name;

};

 }

};

alert(object.getNameFunc()());

// The Window

代码片段二:

var name = "The Window";

var object = {

    name : "My Object",

    getNameFunc : function(){

    var that = this;

        return function(){

        return that.name;

        };

    }

};

alert(object.getNameFunc()());

//My Object

ps:匿名函数的执行环境是window

代码片段三:

代码片段四:


四、闭包的注意事项

 由于闭包会常驻内存,使用不当会导致内存溢出。

相关文章

  • Gradle开发-Groovy闭包

    # 闭包 闭包的基础知识 闭包的使用 闭包 this,owner,delegate 的理解 总结 ## 闭包的基础...

  • Swift基础语法-闭包,闭包函数回调,尾随闭包,闭包捕获值,循

    本节知识点 闭包的基本概念 闭包基本使用 闭包表达式作为回调函数 闭包的多种写法(尾随闭包) 闭包表达式优化 闭包...

  • 闭包介绍

    闭包 关于闭包的定义: A closure is the combination of a function an...

  • 关于JS闭包(JS闭包系列1)

    今天做笔试题,好多关于JS闭包问题,就整理出来,分享一下。 首先,引用下所谓的“官方解释”:所谓“闭包”,指的是一...

  • js闭包问题

    javascript 闭包的概念,闭包的作用,闭包经典面试题详解(配图解) 函数作用域(闭包前置知识) 要彻底弄懂...

  • SwiftUI 里的 swift 闭包总结

    创建 UI 时的闭包使用 在 SwiftUI 里闭包出现的频率特别高,这里我重新梳理了下闭包的定义。 关于闭包 闭...

  • 好程序员web前端培训分享web前端面试题JS篇之闭包

    好程序员web前端培训分享web前端面试题JS篇之闭包,JS中关于闭包的相关知识。如果你想参加web前面工作,那么...

  • JavaScript - 闭包

    理解 关于闭包 答案: 用arguments.callee和闭包实现的函数封装 应用 利用闭包实现自动递增计数

  • 关于Javascript闭包的总结

    关于闭包这个词的解释 维基百科中对于闭包的经典解释: 在计算机科学中,闭包(Closure)是词法闭包(Lexic...

  • javascript闭包

    在网上看了很多关于闭包的讲解,都晦涩难懂,最近看到了阮一峰老师的文章,对闭包有了比较清晰的认识,现在把它整理出来。...

网友评论

      本文标题:关于闭包知识的整理

      本文链接:https://www.haomeiwen.com/subject/icjatrtx.html