为什么修饰器不能用于函数

ES6 修饰器只能用于类和类的方法,不能用于函数,因为存在函数提升。

  1. var counter = 0;
  2. var add = function () {
  3. counter++;
  4. };
  5. @add
  6. function foo() {
  7. }

上面的代码,意图是执行后counter等于 1,但是实际上结果是counter等于 0。因为函数提升,使得实际执行的代码是下面这样。

  1. @add
  2. function foo() {
  3. }
  4. var counter;
  5. var add;
  6. counter = 0;
  7. add = function () {
  8. counter++;
  9. };

下面是另一个例子。

  1. var readOnly = require("some-decorator");
  2. @readOnly
  3. function foo() {
  4. }

上面代码也有问题,因为实际执行是下面这样。

  1. var readOnly;
  2. @readOnly
  3. function foo() {
  4. }
  5. readOnly = require("some-decorator");

总之,由于存在函数提升,使得修饰器不能用于函数。类是不会提升的,所以就没有这方面的问题。

另一方面,如果一定要修饰函数,可以采用高阶函数的形式直接执行。

  1. function doSomething(name) {
  2. console.log('Hello, ' + name);
  3. }
  4. function loggingDecorator(wrapped) {
  5. return function() {
  6. console.log('Starting');
  7. const result = wrapped.apply(this, arguments);
  8. console.log('Finished');
  9. return result;
  10. }
  11. }
  12. const wrapped = loggingDecorator(doSomething);

es6 为什么修饰器不能用于函数相关推荐

  1. python 函数修饰器 父类_Python函数嵌套、回调函数、闭包、装饰器和类

    markdown内容:Python函数嵌套.回调函数.闭包.装饰器和类 一级标题:主要描述内容 二级标题:各个内容 三级标题:重要概念 一.函数嵌套 1.1.作用域和嵌套函数 LEGB查找规则的 E, ...

  2. es6 Trait修饰器

    Trait修饰器 ES6 Trait 也是一种修饰器,效果与 Mixin 类似,但是提供更多功能,比如防止同名方法的冲突.排除混入某些方法.为混入的方法起别名等等. 下面采用traits-decora ...

  3. es6 使用修饰器实现Mixin模式

    使用修饰器实现Mixin模式 在修饰器的基础上,可以实现Mixin模式.所谓Mixin模式,就是对象继承的一种替代方案,中文译为"混入"(mix in),意为在一个对象之中混入另外 ...

  4. es6 使用修饰器实现自动发布事件

    使用修饰器实现自动发布事件 我们可以使用修饰器,使得对象的方法被调用时,自动发出一个事件. const postal = require("postal/lib/postal.lodash& ...

  5. ES6里的修饰器Decorator

    修饰器(Decorator)是一个函数,用来修改类的行为. 一.概述 ES6 引入了这项功能,目前 Babel 转码器已经支持Decorator 首先,安装babel-core和babel-plugi ...

  6. “睡服”面试官系列第二十三篇之修饰器(建议收藏学习)

    目录 1. 类的修饰 2. 方法的修饰 3. 为什么修饰器不能用于函数? 4. core-decorators.js 4.1@autobind 4.2@readonly 4.3@override 4. ...

  7. python函数修饰器_Python函数装饰器指南

    Python 具有强大的功能和富有表现力的语法.我最喜欢的装饰之一.在设计模式的上下文中,装饰器动态更改方法或类功能,而不必直接使用子类.当您需要扩展功能,但不想修改原函数时,这是理想的选择.我们可以 ...

  8. python使用内置方法和修饰器方法获取类名、函数名

    1. 外部获取 从外部的情况好获取,可以使用指向函数的对象,然后用__name__属性. def a():pass a.__name__ 或者 getattr(a,'__name__') 2. 内部获 ...

  9. python中的函数修饰器

    python中的函数修饰器 – @wrapper 简介 类似于C#的属性.Java的注解,python也有对应的修饰符.从Python2.7和Python3开始,提供了以'@'为标示的修饰符,可以在模 ...

最新文章

  1. 零基础小白如何学习好UI设计
  2. MySQL 数据库性能优化,看这篇就够了
  3. 中科院超牛的物理学家,摇滚界无人不知的“李白”,你一定听过他的歌!
  4. LeetCode--single-number复杂度
  5. linux centos 7 crontab 启动,CentOS 7 Linux执行crontab 计划任务实操 - 好应网
  6. linux内核计算list的长度,Linux内核通用链表 linux/list.h阅读
  7. mysql 窗口函数_MySQL数分:窗口函数
  8. 安装Flutter环境
  9. mysql双向复制_MySQL 双向复制
  10. Sql Server中清空所有数据表中的记录
  11. Android软件测试的日志文件问题
  12. window location href 手机端无法跳转_JavaScriptBOM__History_location(二十)
  13. VBA编程_常用函数总结1
  14. 【IOS网络通信】socket第三方库 AsyncSocket(GCDAsyncSocket)
  15. 初学者应该选择什么样吉他桶型?新手入门畅销民谣吉他牌子推荐
  16. NetGear stora 重置成功后,个人文件夹丢失的找回办法
  17. html网页运行环境,网站运行的环境要求
  18. 什么是RSS?RSS是什么
  19. 综合布线施工的技术交底
  20. String比较字符串方法

热门文章

  1. Android之launchMode总结
  2. 自己制作精美的App Store 软件截屏
  3. 晒2012年度十大杰出IT博客 奖品
  4. c语言学生管理系统write to a text file,语言编程学生成绩管理系统.doc
  5. 【elasticsearch系列】windows安装IK分词器插件
  6. myeclipse2017安装与破解
  7. Java初学者不可不知道知识点
  8. yum 安装boost
  9. 为了不被OUT,UC决定不再安静地做个浏览器了
  10. 基于Spring Boot的Logback日志轮转配置