博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
14.当心命名函数表达式笨拙的作用域
阅读量:7102 次
发布时间:2019-06-28

本文共 1433 字,大约阅读时间需要 4 分钟。

相同的JavaScript函数根据上下文其含义会发生变化。

// 在程序的顶层作为函数声明function double() { return x * 2; }// 作为函数表达式var f = function double(x) { return x * 2; };// 匿名函数表达式var f = function(x) { return x * 2; };复制代码

命名函数表达式会绑定到与其相同函数名相同的变量上,该变量将作为该函数内的一个局部变量,可以用来写递归函数表达式(命名函数表达式不能通过其内部的函数名在外部被引用)。

var f = function find(tree, key) {    if (!tree) {        return null;    }    if (tree.key === key) {        return tree.value;    }    return find(tree, left, key) || find(tree, right, key);}复制代码

使用外部作用域的函数名也可到达同样的效果

var f = function(tree, key) {    if (!tree) {        return null;    }    if (tree.key === key) {        return tree.value;    }    return f(tree, left, key) || f(tree, right, key);}复制代码

只使用一个声明

function find(tree, key) {    if (!tree) {        return null;    }    if (tree.key === key) {        return tree.value;    }    return find(tree, left, key) || find(tree, right, key);}var f = find;复制代码

在ES3和有问题的JavaScript环境中命名函数表达式在其作用域内继承了Object.prototype.constructor

var construction = function() { return null; };var f = function f() {    return construction ();}f(); // {}复制代码

在一些JavaScript引擎中另一个缺陷是对命名函数表达式的声明进行提升

var f = function g() { return 17; };g(); // 17// 通过创建一个与函数表达式同名的局部变量并赋值为null来解决var f = function g() { return 17; };var g = null;复制代码

提示

  • 在Error对象和调试器中使用命名函数表达式改进栈跟踪。
  • 在ES3和有问题的JavaScript环境中谨记函数表达式作用域会被Object.prototype污染。
  • 谨记在错误百出的JavaScript环境中会提升命名函数表达式声明,并导致命名函数表达式的重复存储。
  • 考虑避免使用命名函数表达式或在发布前删除函数名。
  • 如果你将代码发布到正确实现的ES5环境中,那么你没有什么好担心的。

转载地址:http://pwyhl.baihongyu.com/

你可能感兴趣的文章
AngularDart Material Design 选择
查看>>
我的C盘空间满了,该怎么清理?
查看>>
ApplicationContext的事件机制
查看>>
Nginx安装、默认虚拟主机、用户认证、nginx中PHP解析
查看>>
20.5 shell脚本中的逻辑判断
查看>>
go 包依赖静态分析
查看>>
媒体转码截图和工作流场景常见问题【系列一】
查看>>
dubbo入门(1)——dubbo-demo
查看>>
聊聊SpringMVC(2)---SpringMVC之请求过程
查看>>
大型网站运维探讨和心得(转载)
查看>>
内网IP和外网IP的区别【图解】
查看>>
PHP 页面跳转的三种方式
查看>>
SAP Cloud for Customer Sales Order Requested Date的业务含义和实现
查看>>
nginx配置https的部署实践
查看>>
Java 集合 List CopyOnWriteArrayList
查看>>
ganache-cli默认network id是什么?
查看>>
Django简单介绍和用户访问流程和项目示例
查看>>
阿里云 Aliplayer高级功能介绍(三):多字幕
查看>>
Data Lake Analytics账号和权限体系详细介绍
查看>>
Spring 定时任务
查看>>