zoukankan      html  css  js  c++  java
  • js的严格模式

    什么是严格模式?

    使JS编码更加规范化的模式,消除Javascript语法的一些不合理、不严谨之处,减少一些怪异行为

    怎么使用?

    直接添加下面的这句字符串就可以了,这种语法可以向后兼容,如果是不支持严格模式的javascript引擎,就会直接当成是一个未赋值的字符串字面量,会直接忽略,支持的引擎就会开启严格模式

    'use strict'

    说明:

    1.在全局作用域使用的话,那整个js脚本就会开启这种模式

    2.如果是只在函数内部使用的话,那么就只是该函数内部开启而已

    function doSomething(){
      'use strict'  
      // 其他代码  
    }

    变量

    1. 在严格模式中什么时候创建变量以及怎么创建变量都是有限制的.首先,不允许意外创建全局变量.在非严格模式下是可以像下面这样创建全局变量,但是严格模式中是不可以的

    // 未声明变量
    // 非严格模式:创建全局变量
    // 严格模式 :抛出referenceEror错误

    2.在严格模式下,对变量名也是有限制.特别的,不能使用implements,interface,let,package,private等保留字作为变量名,用这些变量命名的话,都会导出语法错误

    对象

    在严格模式下 操作对象比在非严格模式下更容易导致错误,下面几种情形会导致语法错误

    1.为只读属性赋值会抛出TypeError

    2.对不可配置的属性使用delete 操作符会抛出TypeError

    3.对不可扩展的对象添加属性会抛出TypeError

    函数

    在严格模式下,要求命名函数的参数必须是唯一的

    // 重命名参数的
    // 非严格模式:没有错误,只能访问第二个参数,如果要访问第一个参数,就必须通过arguments
    // 严格模式语法错误
    function sum(num,num){
       //do something      
    }

    在严格模式下arguments对象的行为也有所不同.在严格模式下,修改命名参数的值也会反映到argument对象中,但是在严格模式下这两个值是完全独立的

    function  showValue(value){
      value = 'foo'
      console.log(value)
      console.log(arguments[0]) // 非严格模式 : 'foo'  严格模式 :'hello'
        
    }      
    showValu('hello')                                

     函数

     在严格模式中,函数的参数必须唯一

    // 重名的参数
    // 非严格模式中,没有错误,只能访问第一个参数
    // 严格模式 :抛出错误 Uncaught SyntaxError: Duplicate parameter name not allowed in this context
    function
    sum(num,num){ 'use strict' // do something }

    arguments对象

    在非严格模式中,修改命名参数的值也会反应到arguments对象中,而严格模式坐下,这两个值是完全独立的

    // 修改命名参数的值
    // 非严格模式:修改会反应到arguments中
    // 严格模式中不会反应到arguments中
    
    function sum(num,num2){
        'use strict'
    num=3
       console.log(arguments[0],num2)// 严格模式下输出为1,2 非严格模式下输出为3,2
    }
    sum(1,2)

     eval()

     eval函数最大的变化就是他在包含上下文中不在创建变量或者函数:

    // 使用eval函数创建变量
    // 非严格模式中:弹出框弹窗 20
    // 严格模式中:调用alert(x)时报错
    function doSomething(){
        eval('var x=20')
        alert(x)
    }

    在严格模式中,可以在eval()中声明变量和函数,但这些边行或者函数只能在被求值的特殊作用域中有效,随后就将被销毁,下面这段代码执行就是没问题的

    'use strict'
    var result=eval('x=1,y=13;x+y')
    alert(result)

    在这里,eval中声明了变量x和y,然后将他们加在一起,反悔了他们的和,于是result变量的值就是21,即x+y的结果,在调用alert时,尽管x和y已经不存在了,result变量的值还是有效的

    抑制this

    在非严格模式下使用函数的apply()或则call()方法时,null和undefined值会被转换为全局对象,而在严格模式下,函数的this值始终是指定的值,无论指定的是什么值:

    // 访问属性
    // 非严格模式:访问全局实行
    // 严格模式:抛出错误,因为this的值是null
    var color = "red";
    function displayColor() {
      alert(this.color);
    }
    displayColor(null);

    其他变化

    在严格模式中with语句被抛弃掉了,在非严格模式中with语句能够改变解析标识符的路径,但在严格模式下,with语句被简化掉了,因此,在严格模式下使用with语句是导致语法错误

    // with语句
    // 非严格模式:允许
    // 严格模式:抛出语法错误
    with (location) {
      console.log(href);
    }
  • 相关阅读:
    flask修改flask_wtf使其支持json数据的validation验证
    nsq 初学使用日记
    git的日常使用(补课)
    mysql 学习日记 悲观和乐观锁
    19.10.11学习日记随笔 mysql事务隔离性
    伸展树 Splay 模板
    NOI2004 郁闷的出纳员 Splay
    Size Balanced Tree(SBT) 模板
    HDU 4557 非诚勿扰 队列、(记一次失败的SBT尝试)
    HDU 4006 The kth great number 优先队列、平衡树模板题(SBT)
  • 原文地址:https://www.cnblogs.com/cythia/p/9084314.html
Copyright © 2011-2022 走看看