关于函数命名的只读性

看题:

    b = 1;
    (function b() {
        b = 2;
        console.log(b);
    })();
    console.log(b);

答案是多少?大部分人会说2和1,但是答案是:

function b(){

    b=2;

    console.log(b)

}                                                        和                1  。


为什么呢?下面来分析下。


对于第二次打印的结果,比较容易回答,这里用到了自执行函数和闭包,就不详细解释了。总的来说就是函数外层的console访问不到函数内部的变量,所以只能是1。

对于第一次打印的结果,这里运用到了函数声明,先来讲解下什么是函数声明和函数表达式


函数声明:

关于函数声明的方式,它的一个重要的特性就是函数声明提升(function declaration hoisting),意思是在执行代码之前会先读取函数声明。这就意味着可以把函数声明放在调用它的语句后面。像下面这样的,

function b() {
        b = 2;
        console.log(b);
    }

函数表达式

 函数表达式有多种表达方式,下面是最常见的一种,

var b =function () {
        b = 2;
        console.log(b);
    }

接下来继续说,由于此题的变量没有带var,即没有变量的声明,也就没有变量作用域的提升,只是单纯的赋值。也不存在函数声明的提升,闭包的影响。下面到重点了,如果在函数内部加上“use strict”(开启严格模式) 这句话,就会出现另外一个现象,上图:


这是谷歌的报错,



这是火狐的报错。


两者的意思就是说b是一个只读属性,此时b指的是函数的名字,不能被修改,所以报错了。


补充:今天又看到了一个例子,也是这种情况。

    b = function c() {
        "use strict";
        c = 3;
        console.log(c);
    };
    b();


注意:这种情况存在于自执行函数和函数声明及函数表达式混合的命名方式中。


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值