zoukankan      html  css  js  c++  java
  • JavaScript

    JS 变量提升

    • JS 中,函数及变量的声明都将被提升到函数的最顶部
    • JS 中,变量可以在使用后面声明,也就是变量可以先使用再声明

    以下两个实例都将获得同样的结果

    // 实例1:先使用变量再声明
    x =5;
    elem = document.getElementById("demo");
    elem.innerHTML = x;
    var x;
    
    // 实例2:先声明变量再使用
    var x;
    x = 5;
    elem = document.getElementById("demo");
    elem.innerHTML = x;
    

    JS 变量初始化不会提升

    • JS 只有声明的变量会提升,初始化的不会被提升

    以下两个实例的结果不同

    // 实例1
    var x = 5;
    var y = 7;
    elem = document.getElementById("demo");
    elem.innerHTML = x + " " + y;		// 结果显示为:5 7
    
    // 实例2
    var x = 5;		// 初始化 x
    elem = document.getElementById("demo");
    elem.innerHTML = x + " " + y;		// 结果显示为:5 undefined
    var y = 7;		// 初始化 y
    

    实例解析

    • 实例2的 y 输出了 undefined ,这是因为变量声明(var y )提升了,但是初始化(y = 7 )并不会提升,所以 y 变量是一个未定义的变量

    实例2类似以下代码

    var x = 5;		// 初始化 x
    var y;			// 声明 y
    elem = document.getElementById("demo");
    elem.innerHTML = x + " " + y;		// 结果显示为:5 undefined
    y = 7;		// 初始化 y
    

    在头部声明所有变量

    • 对于大多数程序员来说并不知道 JS 变量提升
    • 如果程序员不能很好地理解变量提升,他们写的程序就容易出现一些问题
    • 为了避免这些问题,通常我们在每个作用域开始前声明这些变量,这也是正常的 JS 解析步骤,易于理解

    JS 严格模式

    • JS 严格模式,即在严格的条件下运行

    使用 "use strict" 指令

    • "use strict" 指令在 JavaScript 1.8.5(ECMAScript5)中新增
    • "use strict" 指令只允许出现在脚本或函数的开头
    • 它不是一个语句,但是是一个字面量表达式,在 JS 旧版本中会被忽略
    • "use strict" 的目的是指定代码在严格条件下执行
    • 严格模式下不能使用未声明的变量

    严格模式声明

    • 严格模式通过在脚本或函数的头部添加"use strict"表达式来声明
    "use strict";
    x = 3.14;	// 报错(x 未定义)
    
    "use strict";
    myFunction();
    function myFunction() {
        y = 3.14;	// 报错(y 未定义)
    }
    
    • 在函数内部声明是局部作用域(只在函数内部使用严格模式)
    x = 3.14;	// 不报错
    myFunction();
    function myFunction() {
        "use strict";
        y = 3.14;	// 报错(y 未定义)
    }
    

    为什么使用严格模式

    • 消除 JS 语法的一些不合理、不严谨之处,减少一些怪异行为
    • 消除代码运行的一些不安全之处,保证代码运行的安全
    • 提高编译器效率,提高运行速度
    • 为未来新版本的 JS 做好铺垫
    • 严格模式体现了 JS 更合理、更安全、更严谨的发展方向
    • 同样的代码,在严格模式中,可能会有不一样的运行结果
    • 一些在正常模式下可以运行的代码,在严格模式中将不能运行

    严格模式的限制

    • 不允许使用未声明的变量(对象也是一个变量)
    • 不允许删除变量或对象
    • 不允许变量重名
    • 不允许使用八进制
    • 不允许使用转义字符
    • 不允许对只读属性赋值
    • 不允许对一个使用 getter 方法读取的属性进行赋值
    • 不允许删除一个不允许删除的属性
    • 变量名不能使用 "eval" 字符串
    • 变量名不能使用 "arguments" 字符串
    • 不允许使用这种语句:with (Math) {x = cos(2)} // 报错
    • 出于一些安全原因,在作用域 eval() 创建的变量不能被调用
    • 禁止 this 关键字指向全局对象

    严格模式新增的保留关键字

    • implements
    • interface
    • let
    • package
    • private
    • protected
    • public
    • static
    • yield
  • 相关阅读:
    CodeForces Round #545 Div.2
    HDU 2222 Keywords Search
    拓扑排序
    CodeForces Round #553 Div2
    CodeForces Round #552 Div.3
    CodeForces Round #549 Div.2
    #Leetcode# 997. Find the Town Judge
    Educational Codeforces Round 62
    #Leetcode# 524. Longest Word in Dictionary through Deleting
    圆方树小结
  • 原文地址:https://www.cnblogs.com/xdy-/p/13544299.html
Copyright © 2011-2022 走看看