闭包:

闭包可以理解为定义在一个函数内部的函数,
函数A内部定义了函数B,
函数B有访问函数A内部变量的权力;
闭包是函数和子函数之间的桥梁;
举个例子:

let func = function() {
let firstName = 'allen'
let innerFunc = function(lastName) {
console.log(`hello ${firstName}-${lastName}`)
}
innerFunc('Liu');
}
func();

输出:hello allen-Liu
如果父函数已经退出(返回),那么闭包效用也还是在的
接着看这个例子:

let func = function() {
let firstName = 'allen'
let innerFunc = function(lastName) {
console.log(`hello ${firstName}-${lastName}`)
}
return innerFunc
}
let innerFunc = func();
innerFunc('Liu');
innerFunc('Zhang');

输出:

hello allen-Liu
hello allen-Zhang

可见,js的执行引擎不但记住了这个内部函数;还记住了这个内部函数所在的环境
就算让这个内部函数引用它的父函数的入参,它也能引用的到!
而且,不但可以引用环境变量,还可以修改环境变量;

再看个例子:

let func = function() {
let name = 'allen'
let setName = function() {
name = 'kivi'
}
let getName = function() {
console.log(name);
}
return { setName, getName }
}
let obj = func();
obj.getName();
obj.setName();
obj.getName();

输出结果为:
allen
kivi

函数的toString方法:

假设我们知道一个指向某方法的变量,
我们可以调用toString方法看这个方法的代码:

let func = function(x) {console.log(x)};
func.toString();

运行输出:

"function(x) {console.log(x)}"

注意输出的是一个字符串,
这是一个非常强悍的功能,你得到这个字符串之后,可以随时eval它,执行方法的逻辑
遗憾的是,你不能信赖toString方法,

因为有时候你拿不到想要的方法体字符串;
举个例子

let func = (function(x) {console.log(this.x)}).bind({x:123});
func();

输出:123
这是正常的,
因为:bind方法产生了一个新的函数,并且给产生的这个新函数绑定了this,在这里this就是{x:123}
如果调用

func.toString();

输出结果就是:

"function () { [native code] }"

因为ECMAScript对toString方法并没有任何约束,浏览器开发厂商就无所顾忌了
js里的bind方法很有可能是C++实现的,所以你看到了[native code]

最新文章

  1. 微信开发包注意jar版本:
  2. Automation Test in Maya Plugin Development
  3. 使用node+vue.js实现SPA应用,nodevue.jsspa应用
  4. Caffe学习系列(15):添加新层
  5. JQuery以JSON方式提交数据到服务端
  6. Java读写文件的几种方式
  7. [转]Win7下Eclipse中文字体太小
  8. UVA 11754 Code Feat 中国剩余定理+暴力
  9. linux 多线程基础3
  10. c# winform InvokeRequired 解决跨线程访问控件
  11. HDU 5723 Abandoned country(最小生成树 + 树形DP)
  12. 【CSS Cookbook】笔记摘要(一)
  13. HTML学习笔记3:文字和段落
  14. ionic3开发环境的搭建 记录!
  15. PySide2兼容PySide1的补丁代码
  16. SVN服务器搭建实录
  17. rostopic demo
  18. 查询表的DDL
  19. 关于内核中spinlock的一些个人理解 【转】
  20. 【LeetCode】167. Two Sum II - Input array is sorted

热门文章

  1. SharePoint 2019 里安装FlowPortal6.00c报错
  2. Auto入门 之 常用概念
  3. iOS开发WKWebView 返回H5上级页面
  4. MySQL删除大表时潜在的问题(drop table,truncate table)
  5. SQL索引碎片的产生,处理过程。
  6. MySQL数据库:数据完整性及约束的应用
  7. Node.js上传文件出现Unexpected field
  8. pyenv环境部署
  9. IT兄弟连 HTML5教程 CSS3揭秘 在HTML文档中放置CSS的几种方式
  10. 一、I/O模型之BIO