javascript中的闭包、函数的toString方法
闭包:
闭包可以理解为定义在一个函数内部的函数,
函数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方法的更多相关文章
- JavaScript中的闭包和匿名函数
JavaScript中的匿名函数及函数的闭包 1.匿名函数 2.闭包 3.举例 4.注意 1.匿名函数 函数是JavaScript中最灵活的一种对象,这里只是讲解其匿名函数的用途.匿名函数:就是没 ...
- [转]JavaScript中的匿名函数及函数的闭包
JavaScript中的匿名函数及函数的闭包 原文地址:http://www.cnblogs.com/wl0000-03/p/6050108.html 1.匿名函数 函数是JavaScript中最灵 ...
- JavaScript中的匿名函数及函数的闭包(转)
JavaScript中的匿名函数及函数的闭包 https://www.cnblogs.com/wl0000-03/p/6050108.html 1.匿名函数 函数是JavaScript中最灵活的一种 ...
- 一篇文章把你带入到JavaScript中的闭包与高级函数
在JavaScript中,函数是一等公民.JavaScript是一门面向对象的编程语言,但是同时也有很多函数式编程的特性,如Lambda表达式,闭包,高阶函数等,函数式编程时一种编程范式. funct ...
- javaScript中的闭包原理 (译)
这篇文章通过javaScript代码解释了闭包的原理,来让编程人员理解闭包.它不是写给大牛或使用功能性语言进行编程的程序员的.一旦意会了其核心概念,闭包理解起来并不难.然而,你不可能通过阅读任何有关闭 ...
- 让你分分钟学会Javascript中的闭包
Javascript中的闭包 前面的话: 闭包,是 javascript 中重要的一个概念,对于初学者来讲,闭包是一个特别抽象的概念,特别是ECMA规范给的定义,如果没有实战经验,你很难从定义去理解它 ...
- 理解和使用 JavaScript 中的回调函数
理解和使用 JavaScript 中的回调函数 标签: 回调函数指针js 2014-11-25 01:20 11506人阅读 评论(4) 收藏 举报 分类: JavaScript(4) 目录( ...
- 全面理解Javascript中Function对象的属性和方法
http://www.cnblogs.com/liontone/p/3970420.html 函数是 JavaScript 中的基本数据类型,在函数这个对象上定义了一些属性和方法,下面我们逐一来介绍这 ...
- javascript中的闭包解析
学习javaScript已经有一段时间了,在这段时间里,已经感受到了JavaScript的种种魅力,这是一门神奇的语言,同时也是一门正在逐步完善的语言,相信在大家的逐步修改中,这门语言会逐步的完善下去 ...
随机推荐
- Symfonos:3 Vulnhub Walkthrough
主机扫描: ╰─ nmap -p1-65535 -sV -A -sT 10.10.202.130 Starting Nmap 7.70 ( https://nmap.org ) at 2019-08- ...
- MAT分析android内存泄漏
转载请标明出处:https://www.cnblogs.com/tangZH/p/10955429.html 泄漏,泄漏,漏~ 内存泄漏怎么破,什么是内存泄漏?与内存溢出有什么区别? 内存泄漏(Mem ...
- 微信小程序——表单验证插件WxValidate的二次封装(终极版)
微信小程序表单验证前面的两篇文章做的效果总感觉都有点不太友好,第一篇里的效果是将错误信息通过对话框形式弹出来,这种形式在web形式下早已经淘汰了:第二篇是一次性全部显示所有的错误,然后3秒后自动消失, ...
- Redis集群模式下的redis-py-cluster方式读写测试
与MySQL主从复制,从节点可以分担部分读压力不一样,甚至可以增加slave或者slave的slave来分担读压力,Redis集群中的从节点,默认是不分担读请求的,从节点只作为主节点的备份,仅负责故障 ...
- nginx安装及配置访问本地文件
第一步安装nginx windows可以直接去官网下载,解压就能用 http://nginx.org/en/download.html ubuntu用命令行 sudo apt-get install ...
- 如何使用coe_load_sql_profile.sql来固定sql profile
SQLT工具包含一个脚本,名字是 coe_load_sql_profile.sql,下面以用户SCOTT的EMP表为例,说明如何使用该脚本固定sql profile. 1. SQL> -- 对e ...
- 数据治理的王者——Apache Atlas
一.Atlas是什么? 在当今大数据的应用越来越广泛的情况下,数据治理一直是企业面临的巨大问题. 大部分公司只是单纯的对数据进行了处理,而数据的血缘,分类等等却很难实现,市场上也急需要一个专注于数据治 ...
- linux bash基础特性
使用history命令,取得命令历史,当bash进程结束后,会把命令历史存放到文件中,下次开机还能看到命令历史. 定制history:通过设置环境变量,来定制history 环境变量$HISTSIZE ...
- 附002.Minikube介绍及使用
一 Minikube介绍 1.1 概述 Minikube是一种可以在本地轻松运行Kubernetes的工具.Minikube在笔记本电脑的VM中运行单节点Kubernetes集群,供希望尝试Kuber ...
- 基于django的个人博客网站建立(五)
基于django的个人博客网站建立(五) 前言 网站效果可点击这里访问 之前鸽了两天,今天继续再写点 主要内容 今天加了个展示照片的功能,就叫他生活记录吧 先建表 class Record(model ...