闭包:

闭包可以理解为定义在一个函数内部的函数,
函数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]

javascript中的闭包、函数的toString方法的更多相关文章

  1. JavaScript中的闭包和匿名函数

    JavaScript中的匿名函数及函数的闭包   1.匿名函数 2.闭包 3.举例 4.注意 1.匿名函数 函数是JavaScript中最灵活的一种对象,这里只是讲解其匿名函数的用途.匿名函数:就是没 ...

  2. [转]JavaScript中的匿名函数及函数的闭包

    JavaScript中的匿名函数及函数的闭包  原文地址:http://www.cnblogs.com/wl0000-03/p/6050108.html 1.匿名函数 函数是JavaScript中最灵 ...

  3. JavaScript中的匿名函数及函数的闭包(转)

    JavaScript中的匿名函数及函数的闭包  https://www.cnblogs.com/wl0000-03/p/6050108.html 1.匿名函数 函数是JavaScript中最灵活的一种 ...

  4. 一篇文章把你带入到JavaScript中的闭包与高级函数

    在JavaScript中,函数是一等公民.JavaScript是一门面向对象的编程语言,但是同时也有很多函数式编程的特性,如Lambda表达式,闭包,高阶函数等,函数式编程时一种编程范式. funct ...

  5. javaScript中的闭包原理 (译)

    这篇文章通过javaScript代码解释了闭包的原理,来让编程人员理解闭包.它不是写给大牛或使用功能性语言进行编程的程序员的.一旦意会了其核心概念,闭包理解起来并不难.然而,你不可能通过阅读任何有关闭 ...

  6. 让你分分钟学会Javascript中的闭包

    Javascript中的闭包 前面的话: 闭包,是 javascript 中重要的一个概念,对于初学者来讲,闭包是一个特别抽象的概念,特别是ECMA规范给的定义,如果没有实战经验,你很难从定义去理解它 ...

  7. 理解和使用 JavaScript 中的回调函数

    理解和使用 JavaScript 中的回调函数 标签: 回调函数指针js 2014-11-25 01:20 11506人阅读 评论(4) 收藏 举报  分类: JavaScript(4)    目录( ...

  8. 全面理解Javascript中Function对象的属性和方法

    http://www.cnblogs.com/liontone/p/3970420.html 函数是 JavaScript 中的基本数据类型,在函数这个对象上定义了一些属性和方法,下面我们逐一来介绍这 ...

  9. javascript中的闭包解析

    学习javaScript已经有一段时间了,在这段时间里,已经感受到了JavaScript的种种魅力,这是一门神奇的语言,同时也是一门正在逐步完善的语言,相信在大家的逐步修改中,这门语言会逐步的完善下去 ...

随机推荐

  1. Hackme: 1: Vulnhub Walkthrough

    下载链接: https://www.vulnhub.com/entry/hackme-1,330/ 网络扫描探测: ╰─ nmap -p1-65535 -sV -A 10.10.202.131 22/ ...

  2. jq实现回车键事件

    我们写系统的时候常常因为要点击显得很麻烦,习惯了回车键完成一些东西. 接下来就直接上代码吧.jq实现回车键事件 keyDowm: () => { $("body").keyd ...

  3. C#后台架构师成长之路-基础体系篇章大纲

    如下基础知识点,如果不熟透,以后容易弄笑话..... 1. 常用数据类型:整型:int .浮点型:double.布尔型:bool.... 2. 变量命名规范.赋值基础语法.数据类型的转换.运算符和选择 ...

  4. git结合项目基本使用

    学习博客:1,史上最浅显易懂的Git教程! 2,结合项目具体使用 3,常用命令快速查看 4,git stash 用法总结和注意点 一.git的工作原理和工作流程 Workspace:工作区 Index ...

  5. [译]Vulkan教程(13)图形管道基础之Shader模块

    [译]Vulkan教程(13)图形管道基础之Shader模块 Shader modules Unlike earlier APIs, shader code in Vulkan has to be s ...

  6. java中的this、super、static、final、abstract关键字的作用

    this关键字的作用 1.this是对象内部指代自身的引用,同时也是解决成员变量和局部变量同名问题: 2.this可以调用成员变量,不能调用局部变量: 3.this也可以调用成员方法,但在普通方法中可 ...

  7. Googleplaystore数据分析

    本次所用到的数据分析工具:numpy.pandas.matplotlib.seaborn 一.分析目的 假如接下来需要开发一款APP,想了解开发什么类型的APP会更受欢迎,此次分析可以对下一步计划进行 ...

  8. 当面试官要你介绍一下MQ时,该怎么回答?

    一.为什么要使用MQ消息中间件? 一个用消息队列的人,不知道为啥用,有点尴尬.没有复习这点,很容易被问蒙,然后就开始胡扯了. 回答:这个问题,咱只答三个最主要的应用场景,不可否认还有其他的,但是只答三 ...

  9. 工作笔记 之 Python应用技术

    python socket编程详细介绍 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket,建立网络通信连接至少要一对端口号(socket). Socket本质是 ...

  10. 面试:Stream#foreach方法摸底三问,你都了解吗

    JAVA8 新增了 Stream API,而在 Stream API 中又为程序员提供了一个遍历集合的 foreach 方法:java.util.stream.Stream#forEach. 那你对这 ...