• 草珊瑚认为的JavaScript的注意点


    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8" />
        <title>js的注意点</title>
        <script type="text/javascript">
        //关于解析和执行
            console.log("后声明的变量值:"+later_var);
            var later_var ="姗姗来迟";
    
            console.log("后面声明的方法:"+later_function);
            
            // 之后声明的方法和变量,名字相同,方法优先。
            var later_function = "先于方法,声明的变量later_function";
            function later_function(){
                return "方法later_function";
            }
    
            // var later_function ="后于方法,声明的变量later_function";//试着注释这条语句看一下
            // 之前声明的方法和变量,名字相同,变量优先。
            try{
                console.log(later_function());
            }
            catch (e){
                console.log("出错信息:"+e);
            };
            console.log(later_function);
    
        // 关于引用传递
            var obj_a = {"a":"I am a","b":"no b"};
            var obj_b = obj_a;
            obj_a["b"] = "you b";
            console.log("对象是引用传递"+obj_b.b);
    
            var arr_a = [1];
            var arr_b = arr_a;
            arr_a.push(2);
            console.log("数组是引用传递"+arr_b);
    
        // 关于局部变量和全局变量
            (function set_global_var(){
                var func_inner_var = "方法里面的局部变量";
                window['func_global_var'] = "方法里面的全局变量";
                func_global_var2 = "方法里面的全局变量2";
            })();
            if(true){
                var if_inner_var = "if里面的局部变量";
            }
            console.log(if_inner_var);
            console.log(func_global_var+""+ func_global_var2);
            try{
                console.log(func_inner_var);    
            }
            catch(e){
                console.log("局部变量只能在function里面生成");
            }
        //关于for in和hasOwnProperty
            Array.prototype["extra_prototype_string"] = "extra_prototype_string";
            var loop_a = ["a"];
            loop_a.prototype = "extra_a";
            for(var i in loop_a){
                console.log(loop_a[i]);
            }
            for(var i in loop_a){
                if(loop_a.hasOwnProperty(i)){
                    console.log(loop_a[i]);
                }
            }
        // ==会类型转换,而===不会
            console.log('"1"==1 is '+("1"==1));
            console.log('"1"===1 is '+("1"===1));
            console.log('"1"+2 = '+("1"+2)+" 注意12是字符串");
    
        // 闭包
            function closure(){
                var a= 1;
                function inner_func(){
                    a++;
                    return a;
                }
                return inner_func;
    
            }
            // 这里生成了闭包
            var cl = closure();
            console.log('生成了闭包:'+cl()+cl()+cl());
            console.log('你以为这里没有生成闭包吗,其实这里产生闭包了,只不过马上释放了:'+closure()()+closure()()+closure()());
    
        // 关于原型继承,这个例子来源于JavaScript秘密花园
            // 函数Foo声明时,默认Foo.prototype.constructor = Foo
            function Foo() {
                this.value = 42;
            }
            Foo.prototype = {
                method: function() {return 43}
            };
    
            function Bar() {}
    
            // 设置Bar的prototype属性为Foo的实例对象
            Bar.prototype = new Foo();
            console.log(new Foo().constructor);
            
            Bar.prototype.foo = 'Hello World';
    
            /*修正Bar.prototype.constructor为Bar本身。
            因为上面Bar.prototype被Foo函数实例给赋值了,导致丢失原来的Bar.prototype.constructor。当然,也有constructor,因为Bar.prototype是一个对象,所以constructor是function Object(){Native code}*/
            Bar.prototype.constructor = Bar;
    
            var test = new Bar() // 创建Bar的一个新实例
            console.log(new Bar().method());
            console.log(Bar.prototype.constructor);
            console.log(test instanceof Bar);
            console.log(test instanceof Foo);
    
        </script>
    </head>
    <body>
    <button id="makeinput">生成 input</button>
    <p id="inpwrapper"></p>
    <script type="text/javascript">
    /*
    浏览器至少有三个线程,GUI渲染线程,JS线程,事件监听线程,HTTP监听线程,浏览器定时计时器线程。其中JS线程和GUI渲染线程互斥,也就是两个线程不能同时进行。
    */
    document.getElementById('makeinput').onmouseup = function() {
        var input = document.createElement('input');
        input.setAttribute('type', 'text');
        input.setAttribute('value', 'test1');
        document.getElementById('inpwrapper').appendChild(input);
       /* 去掉setTimeout看看,什么效果。发现没有选中新生成的内容。因为这是onmousedown事件,onmousedown事件执行完后,chrome会把焦点还给浏览器,所以焦点不会聚在新生成的input里。但是onmouseup和click事件不会把焦点还给浏览器。setTimeout则把焦点聚焦的执行任务,放在js引擎的执行队列里,当onmousedown事件执行完后,就执行setTimeout里面的代码了,所以能聚焦了。*/
        setTimeout(function() {
            input.focus();
            input.select();
        }, 0);
    };
    </script>
    </body>
    </html>

    合乎自然而生生不息。。。
  • 相关阅读:
    Virtual Drive Manager V1.3.2(小巧实用的虚拟光驱)绿色版
    WimTool(Wim映像处理工具) V1.30.2011.501 免费绿色版
    WinHex V18.7(16进制编辑器) 多国语言绿色版
    WinSnap屏幕截图 V4.5.6 官方最新版
    Wsyscheck(系统检测维护工具) v1.68.33绿色版
    XueTr 0.45 (手工杀毒辅助工具) 绿色版
    Colorful(Folders星语多彩文件夹) v1.7绿色版
    飞雪桌面日历软件 V8.6 免费绿色版
    Notepad++ V6.9.0 中文绿色便携版
    屏幕尺子(电脑尺子) 1.0 免费绿色版
  • 原文地址:https://www.cnblogs.com/samwu/p/2857019.html
Copyright © 2020-2023  润新知