js 闭包(面试题)

js 闭包(面试题),第1张

1 闭包的本质就是在一个函数内部创建另一个函数。

2

匿名函数作为fun的返回值被赋值给了f,

这时候相当于 f=function(){var n = 0 … },

并且匿名函数内部引用着fun里的变量num,所以变量num无法被销毁,

而变量n是每次被调用时新创建的,所以每次 f 执行完后它就把属于自己的变量连同自己一起销毁,

于是乎最后就剩下孤零零的num,于是这里就产生了内存消耗的问题

3 定时器与闭包

最后总结一下闭包的好处与坏处

好处

①保护函数内的变量安全 ,实现封装,防止变量流入其他环境发生命名冲突

②在内存中维持一个变量,可以做缓存(但使用多了同时也是一项缺点,消耗内存)

③匿名自执行函数可以减少内存消耗

坏处

①其中一点上面已经有体现了,就是被引用的私有变量不能被销毁,增大了内存消耗,造成内存泄漏,解决方法是可以在使用完变量后手动为它赋值为null;

②其次由于闭包涉及跨域访问,所以会

最好别用匿名函数,重复触发会重复添加,你添加的匿名函数会重复执行

最好声明出来,然后不能有参数,因为addEventListener的第二个参数是函数名,不能是函数名()这样的形式,不然在添加的时候就会运行一次

用声明出来的函数,重复触发addEventListener也不会添加多个

刚刚踩坑,55555555

匿名函数在声明时不用带上函数名, 可以把匿名函数当作一个function类型的值来对待

声明一个普通的函数 function func() { } 可以认为和var func = function() { };相同, 但是普通函数会自动把函数名"提到"作用域的最前面, 基本上普通函数和匿名函数就只有这一个区别

function xxx() {

foo(); //foo被提到了作用域的最前面, 于是这里可以正常调用foo函数

bar(); //这里会报错bar是个undefined

function foo(){}

var bar = function(){};

}

Immediately-Invoked Function Expression(IIFE立即执行函数表达式)

可以让函数在创建后立即执行 必须是一个表达式

1、函数的定义方式一: 函数声明

2、函数的定义方式二: 函数表达式(匿名函数表达式、命名函数表达式)

1、错误写法 直接报错 js引擎看到function关键字会认定后面跟的是函数定义语句,此时后面如果直接加上()会被当做分组 *** 作符,而分组 *** 作符必须有表达式,所以此时报错

2、立即执行函数的正确写法,让js引擎认为这是一个表达式

1、立即执行函数不能再外面再被调用,执行完之后已经被立即销毁了。所以立即执行函数的函数名称可以省略, 统一使用匿名函数表达式

2、由于立即执行函数,执行完后就立即被销毁了 所以它可以创建一个独立的作用域,而且该作用域里面的变量,外面访问不到。因此就可以避免变量污染

正确输出写法:用立即执行函数将i作为参数传入,立即函数每次执行时,会把参数i的值复制一份。然后再创建函数作用域来执行函数

1、立即执行函数和闭包只是有一个共同有点就是都能减少全局变量的使用

2、立即执行函数只是函数的一种调用方式,声明完后立即调用,一般只能调用一次,调用完后会立即被销毁,不会占用内存,有自己的独立作用域,外部不能调用

3、闭包则主要是让外部函数可以访问内部函数的作用域,也减少了全局变量的使用,保证了内部变量的安全,但是被引用的内部变量不会被销毁,增大了内存消耗,使用不当会容易造成内存泄露

可参考: https://wwwcnblogscom/wenxuehai/p/10357274html

JS中创建函数的几种方法

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

function fn1(){}

创建匿名函数表达式:创建一个变量,这个变量的内容为一个函数

var fn1 = funciton (){}

创建具名函数表达式:具名函数表达式的函数名只能在创建函数内部使用,即采用此种方法创建的函数在函数外层只能使用fn1不能使用func_name的函数名。func_name的命名只能在创建的函数的内部使用

var fn1 = funciton func_name(){}

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

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

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

Function构造函数

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

其他创建函数的方法

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

webpack打包原理是根据文件间的依赖关系对其进行静态分析,然后将这些模块按指定规则生成静态资源,当 webpack 处理程序时,它会递归地构建一个依赖关系图(dependency graph),其中包含应用程序需要的每个模块,然后将所有这些模块打包成一个或多个 bundle。

webpack有两种组织模块的依赖方式,同步、异步。异步依赖将作为分割点,形成一个新的块;在优化了依赖树之后,每一个异步区块都将作为一个文件被打包。

webpack有一个智能解析器,几乎可以处理任何第三方库。无论它们的模块形式是CommonJS、AMD还是普通的JS文件;甚至在加载依赖的时候,允许使用动态表require("、/templates/"+name+"、jade")。

扩展资料

在使用webpack构建的典型应用程序或站点中,有三种主要的代码类型:

1、团队编写的源码。

2、源码会依赖的任何第三方的library或"vendor"代码。

3、webpack的runtime和manifest,管理所有模块的交互。

runtime 包含:在模块交互时,连接模块所需的加载和解析逻辑;包括浏览器中的已加载模块的连接,以及懒加载模块的执行逻辑。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/12176377.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存