zoukankan      html  css  js  c++  java
  • 严格模型和非严格模式的区别

    严格模式 use strict,就是在代码的头部加上use strict 

    function test(){
                console.log(arguments.callee)
                console.log(123)
            }
            test()
    把这段代码放到浏览器是不会报错的,但是,如果严格模式是会报错的,小伙伴们可以拿过去代码去加上use strict在自己的浏览器上试试
    因为严格模式是没有arguments,caller,callee
    说一下这个callee 当函数本身 

    function test(){
    var i = 1
    return function(){
    i++;
    console.log(11)
    if(i<3){
    arguments.callee()
    }else{
    return
    }
    }

    }
    test(1,2)()

    他常用于递归调用。

    function test1(){
                console.log(test1.caller)  //用他的函数
            }
            function demo(){
                test1()
            }
            demo()
     
    caller是值得是调用它的函数。
    谁调用的test1当然是demo了
     
     
    不过如果你给他加上use strict他也会报错的,因为严格模式也不支持caller.
     
     
    with(document){
                write('a')
            }
            var obj = {
                name:'ff'
            }
            var name = 'wind'
            function fn(){
                var name = 'scope'
                with(obj){
                    console.log(name)
                }
            }
            fn()
    with里面如果有对象,他就当作执行代码的最顶端,这里面我们fn()打印出来的就是ff,如果with里面没有东西的话,fn()打印的就是scope,
    如果加上use strict直接就报错了
     
    还有一条函数里面this不是window 在严格模式下
    'use strict'
            function test(){
                console.log(this) //要想有值必须赋值 undefined
            }
            // new test()
            test()
            // test.call(123)
    如果有new test()他里面就是生成的new 实例,
    如果call的话这个this当然就是123
     
    还有咱们关心的class类
     
    class Person{
                constructor(name){
                    this.name = name
                }
                get(){
                    console.log(this)//默认严格模式
                    // this.run()
                }
                run(){
                    console.log(111)
                }
            }
            let person = new Person('zs')
            person.get()
            let {get} = person
            get()
            //es6类中默
    class类里面this是undefined为什么?
    因为get被暴露在了window下面,但是这个方法里面是严格模式我们自然知道打印的就是undefined
     
    'use strict'
            function get(name,name){
                this.name = name
            }
            get(1)

            ///es5和标注浏览器的一个误差
            'use strict'
            var obj = {
                name:'d',
                name:'s'
            }
     
    函数不能重名,对象这个检测不到浏览器
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    linux /dev 常见特殊设备介绍与应用[loop,null,zero,full,random]
    由web程序出现乱码开始挖掘(Bom头、字符集与乱码)
    linux shell命令快捷获得系统帮助(一)[manpages定义规范]
    定期分割tomcat输出文件 catalina.out
    readyState的五种状态
    C# FileSystemWatcher
    不用第三个变量实现a,b的值交换
    我的eWork,我能赚钱的SOHO空间
    如何网上炒股
    没有为扩展名“.html”注册的生成提供程序
  • 原文地址:https://www.cnblogs.com/MDGE/p/12423835.html
Copyright © 2011-2022 走看看