zoukankan      html  css  js  c++  java
  • js返回值

    看下js变量、作用域、内存文档。

    1.

    <script type="text/javascript">
        function c(){
            return 23;
        }
        var a=c;
        var b=c();
        alert(typeof a);//function
        alert(typeof b);//number
       alert(typeof c);//function
       alert(typeof c());//number
    </script>

    如果函数c里没有return,则typeof b的结果是undefined。

    函数定义:声明 表达式

    var f=function d(){
         return 3;
    }
    alert(typeof f);//function alert(
    typeof d());//Error 没有输出结果
    var ff=function(){
    }//函数表达式,上边f=function d(){}写法不对

    2.

    var msg='hello';
    for (var i=0; i<10; i++)
    {
        var msg='hello'+i*2+i; 
    } 
    alert(msg); //hello189

    3.

    var bb = 1;
    function aa(bb) {
        bb = 2;
        alert(bb);
    };
    aa(bb);//2
    alert(bb);//1

    函数aa内的bb是参数变量,不会影响外部bb的值。

    4.

    var a,b;
    (function(){//自执行函数
        alert(a);//undefined
        alert(b);//undefined
        var a=b=3;
        alert(a);//3 在函数内部相当于给ab赋值3
        alert(b);//3
    })();
    alert(a);//undefined 在函数外部
    alert(b);//3 在函数外部 自执行函数内的var a=b=3相当于b=3,b相当于全局变量了,所以能访问到

    非常不建议不使用var就初始化变量,因为这种方法会导致各种意外发生

    5.简单的闭包-js匿名函数和闭包文档

    参考:http://www.jb51.net/article/24101.htm

    function Foo() {
        alert("i");
        var i = 0;
        return function() {
            console.log(i++);
        }
    }
     
    var f1 = Foo(), f2 = Foo();
    f1();
    f1();
    f1();
    f2();
    //控制台输出结果:0 1 2 3 0

    闭包:在函数外部获得函数内部局部变量的一种方法。

    function a(){ 
        var num=3; 
        return function b(){
            alert(num);
            num++;
        }
    }
    var m=a();
    m();//3
    m();//4
    var name = "The Window";   
      var object = {  
        name : "My Object",  
        getNameFunc : function(){  
          return function(){  
            return this.name;  
         };   
        }   
    };  
    alert(object.getNameFunc()());  //The Window
    
    var name = "The Window";   
      var object = {  
        name : "My Object",  
        getNameFunc : function(){  
         return this.name;  
        }   
    };  
    alert(object.getNameFunc());  //My Object"

    6.

    在闭包中使用this对象也可能会导致一些问题,this对象是在运行时基于函数的执行环境绑定的,如果this在全局范围就是window,如果在对象内部就指向这个对象。而闭包却在运行时指向window的,因为闭包并不属于这个对象的属性或方法

    (function box() {    //自执行-封装成表达式  (内容)(参数)
        alert('Lee');
    })();    
    (function box(n) {//自执行-封装成表达式  (内容)(参数)
        alert(n);//输出word
    })("word");    
    //相当于如下形式,只不过fn是不存在的
    var fn=function(n){
    };
    fn("word");

    这里就要说一次(function($){})(jQuery)和$(function(){})了

    (function($){})(jQuery)形式同上,定义一个参数为$的匿名函数,并将jQuery作为参数来调用这个匿名函数。简单理解是用来定义一些需要预先定义好的函数。执行时dom不一定存在;

    $(function(){})则是在dom加载完成后来执行预先定义好的函数。用于存放操作dom对象的代码,执行代码的时候dom对象是已经存在的。

    简单的插件写法示意:

    (function($){
            $.fn.tabSwitch=function(){};
            $.fn.menuSelect=function(){};
    })(jQuery);

    引用:

    $(function(){
         $.fn.tabSwitch();
    })

     7.

    html

    <ul>
         <li>1</li><li>2</li><li>3</li>
    </ul>

    javascript

    var Li=document.getElementsByTagName("li");
    var ll=Li.length;
    for(i=0;i<ll;i++){
        Li[i].onclick=function(){
            alert(i);   
        }
    }

    依次点击li输出:3,3,3

    刚开始只是注册了一个事件处理函数,点击事件触发函数执行alert(i),而此时的i=4,在点击事件发生之前循环已经结束。

    //循环里包含匿名函数
    function box() {
        var arr = [];
    
        for (var i = 0; i < 5; i++) {
            arr[i] = function () {
                return i;
            };
        }
        return arr;
    }
    
    var b = box();                                //得到函数数组
    alert(b.length);                                //得到函数集合长度
    for (var i = 0; i < b.length; i++) {
        alert(b[i]());                            //输出每个函数的值,都是最后一个值
    }

    这是作用域链的机制导致一个问题,在循环中里的匿名函数取得的任何变量都是最后一个值。

    上面的例子输出的结果都是5,也就是循环后得到的最大的i值。因为b[i]调用的是匿名函数,匿名函数并没有自我执行,等到调用的时候,box()已执行完毕,i早已变成5,所以最终的结果就是5个5。

    //循环里包含匿名函数-改1,自我执行匿名函数
    function box() {
        var arr = [];
        for (var i = 0; i < 5; i++) {
            arr[i] = (function (num) {            //自我执行
                return num;
            })(i);                            //并且传参
        }
        return arr;
    }
    var b = box();                    
    for (var i = 0; i < b.length; i++) {
        alert(b[i]);    //这里返回的是数组,直接打印即可
    }

    改1中,让匿名函数进行自我执行,导致最终返回给a[i]的是数组而不是函数了。最终导致b[0]-b[4]中保留了0,1,2,3,4的值。

    //循环里包含匿名函数-改2,匿名函数下再做个匿名函数
    function box() {
        var arr = [];
        for (var i = 0; i < 5; i++) {
            arr[i] = (function (num) {
                return function () {//直接返回值,改2变成返回函数
                    return num;//原理和改1一样
                }
            })(i);
        }
        return arr;
    }
    var b = box();                    
    for (var i = 0; i < b.length; i++) {
        alert(b[i]());//这里通过b[i]()函数调用即可
    }

    改1和改2中,我们通过匿名函数自我执行,立即把结果赋值给a[i]。每一个i,是调用方通过按值传递的,所以最终返回的都是指定的递增的i。而不是box()函数里的i。

    8.

    console.log(1+ "2"+"2");
    console.log(1+ +"2"+"2");
    console.log("A"- "B"+"2");
    console.log("A"- "B"+2);

    输出:122 32 NaN2 NaN

    加法:有一个操作数是字符串就拼成字符串输出。

    一元加:+“2”会将字符串转换成数值,所有1++“2”结果为数值3,3+“2”有一个操作数是字符串,最终是字符串。如果有一个操作数是NaN则加法结果是NaN, 不过如果有一个操作数是字符串,应该遵循:如果两个都是字符串-拼接,如果一个是字符串,则把另一个转换成字符串拼接。

    减法:如果操作数是字符串 null undefined 布尔值,则调用Number()。减法操作:如果有一个操作数是NaN则减法操作结果为NaN。"A"-"B"不能转换成数值,结果为NaN;NaN+"2",一个操作数是字符串,转换nan为字符串,输出NaN2。

  • 相关阅读:
    csu1022 菜鸟和大牛 dp
    POJ 1001 Exponentiation
    KMPmatch 字符串模式匹配
    UVaOJ458 The Decoder
    UVaOJ 10300 Ecological Premium
    MLE: 找出出现偶数次的那个数
    csu 1207: 镇管的难题
    csu 1079
    UVaOj 494 Kindergarten Counting Game
    轻松掌握Ajax.net系列教程七:使用ModalPopupExtender
  • 原文地址:https://www.cnblogs.com/theEndOfSummer/p/4503532.html
Copyright © 2011-2022 走看看