zoukankan      html  css  js  c++  java
  • 函数的作用域

    一、函数的作用域

    在函数 内部定义的变量,只能在函数的内部声明。

    作用域链(自身—父级—上级)

    例1(无形参)

     
     
     
     
     
    var a=10;
    function fn(){
       a=20;
    }
    console.log(a);
    fn();
    console.log(a);
     

    例2(有形参)

     
     
     
     
     
    var a=10;
    function fn(a){
    //var a=undefined;
       a=20; 
    }
    fn();
    console.log(a);
    //结果为10
     

    例3

     
     
     
     
     
    var a=10;                            //a=30;
    var fn=function(){                   //向外层找a的声明,找到全局变量
      a=30;                              //a=30;
      var fn2()=function(a){             //系统声明var a   并将a赋值为30;
        console.log(a);                  //30
        a=40;
        console.log(a);                  //40
      }
      fn2(a);                           //a的值此时为30,然后调用fn2()函数
      console.log(a);                   //30
    };
    fn();
    console.log(a);                      //30
    //结果为30,40,30,30
     

    补充:※※函数提升,把函数定义的时机,放在当前作用域的开头。(在 js中只有函数才产生作用域,而if,while,for其他语句,都不会产生作用域)

    当2个函数处于同等级的情况下。

     
     
     
     
     
    var a=1;
    var fn1=function(){
      var a=10;
    };
    var fn2=function(){
      console.log(a);             //向外层找a的声明。跳过同等级的
    };
    fn1();
    fn2();
    //结果为1
     

    变量提升:在声明变量时2,会把当前变量声明的时机放在当前作用域的开头。(只有变量的声明才有提升,变量的赋值没有提升)

     
     
     
     
     
    console.log(a);
    var a=10;    //等同于var a;   a=10;    其中var a;变量提升。
    //结果为undefined
     

    二、对象

    一堆无先后顺序的数据的集合*(每个数据都要取名,即属性名)

    属性名的命名规则,比较宽松。

     
     
     
     
     
    var obj={
      name:'Bob',
      age:20,
      gender:'man',
      123:false,
      'test+test':'hello'
    };
    console.log(obj);
    //输出结果为:object{name:'BOb',age:20,gender:'man',123:false,test+test:'hello'}
    console.log(obj.name);    //第一种取值方式
    //输出结果为:Bob
    console.log(obj.age);     //第一种取值方式
    //输出结果为:20
    console.log(obj['name']);  //第二种取值方式,当属性名命名是比较宽松的命名方式时,采取。比如使用数字开头,或者属性名中间出现了一些符号。
    console.log(obj['123']);   
    //输出结果为:false
    console.log(obj['test+test']);
    //输出结果为:hello
     

    取对象的2种方式:点和方括号——一般情况推荐使用点的方式(代码更紧凑)

    区别:

    1、点会把后面的名称直接作为属性名,而方括号会把返回值作为属性名。2、对于一些特殊的属性名,比如使用数字开头,或者属性名中间出现了一些符号。这些属性职能通过方括号的方式取。

    用对象将数据中最大的,最小的都返回出来(将多项数据组合在一起输出)

     
     
     
     
     
    function fn(a,b,c){
      var arr=[a,b,c];
      //使用冒泡法比较数组的大小
      for(var i=0,i<arr.length-1;i++){
        for(var j=0;j<arr.length-i-1;j++){
          if(arr[j]>arr[j+1]){
            //定义新的变量
            var tempt=arr[j];
            //交换位置
            arr[j]=arr[j+1];
            arr[j+1]=tempt;  
          }
        }  
      }
      var min=arr[0];
      var max=arr[2];
      //定义对象,将最大,最小值写入
      var obj={
        min=min,
        max=max
      };
      console.log(obj);
    }
     

    数组与对象的区别(数组有长度,并且长度会随着变化。而对象没有长度概念之说。)

    通过new创建数组(缺点,比较麻烦,不够直观)

     
     
     
     
     
    //第一种方式
    var arr=new Array();
    arr[0]=1;
    arr[1]=2;
    arr[2]=3;
    console.log(arr);
    //结果为:[1,2,3]
    //第二种方式
    var arr=new Array(5);
    arr[0]=1;
    arr[1]=2;
    arr[2]=3;
    arr[5]=6;
    console.log(arr);
    console.log(arr.length);
    //结果为[1,2,3,5:6]
    //6
    //第三种方式
    var arr=new Array(1,2,3);
    console.log(arr);
    console.log(arr.length);
    //结果为[1,2,3]
    //3
    //第4种方式-数组字面量方式
    var arr=[1,2,3]
    //总结;如果没有特殊情况,建议使用第4种方式。
     

    数组类型的方法

    concat()方法:首尾连接作用

     
     
     
     
     
    var arr=[1,2,3];
    var arr2=[10,20];
    var arr3=[30,40];
    var result=arr.concat(arr2,arr3);
    console.log(result);
    //结果为:[1,2,3,10,20,30,40]
     

    join()方法:将数组的每一项拼接到一起,结果为字符串

     
     
     
     
     
    var arr=[1,2,3];
    var result=arr.join();     //默认情况下为,号
    console.log(result);
    //结果为:1,2,3
    var arr=[1,2,3];
    var result=arr.join('');   //连在一起的情况
    console.log(result);
    //结果为:123
    var arr=[1,2,3];
    var result=arr.join(' ');   //中间有一个空格
    console.log(result);
    //结果为:1 2 3
    var arr=[1,2,3];
    var result=arr.join('+');    //中间的连接符号为+
    console.log(result);
    //结果为:1+2+3
     

    pop()方法:删除最后一项,且返回值为最后一项。

     
     
     
     
     
    var arr=[1,2,3,5];
    var result=arr.pop();       //删除最后一项
    console.log(result);        //返回值为最后一项
    console.log(arr);
    //输出结果为:5
    //          [1,2,3]
     

    push()方法:添加一项,并且将数组的长度改变。增加一项。也可以同时添加多项,并用,号隔开。

     
     
     
     
     
    var arr=[1,2,3,5];
    var result=arr.push('hello''js');    
    console.log(result);    //返回值为新的数组的长度
    console.log(arr);
    //结果为:6
    //      [1,2,3,5,'hello','js']
     

    reverse()方法:将数组里面的数据颠倒顺序。并且原数组也会跟着变化

     
     
     
     
     
    var arr=[1,2,3,4,5];
    var result=arr.reverse();
    console.log(arr);
    console.log(result);
    //结果为:[5,4,3,2,1]
    //       [5,4,3,2,1]
     

    shift()方法:删除并返回数组的第一个元素

     
     
     
     
     
    var arr=[1,2,3,4,5];
    var result=arr.shift();
    console.log(arr);
    console.log(result);
    //结果为:[2,3,4,5]
    //       [1]
     

    slice()方法:截取数组的片段

     
     
     
     
     
    var arr=[1,2,3,hello,4,5,js];
    var result=arr.slice(3,6);  //注意结束取值,不包含end元素;当star或者end为负数时,则从右向左数。(负数的写法只能在slice中使用)
    console.log(arr);
    console.log(result);
    //结果为:[1,2,3,hello,4,5,js]
    //        [hello,4,5]
     

    sort()对数组中的元素进行排序,(从小到大排序,注意,只能对首个字符进行排序)

     
     
     
     
     
    var arr=[2,1,3,7,4];
    arr.sort();
    console.log(arr);
    //结果为:[1,2,3,4,7]
    var arr=[23,1,300,7,4];
    //定义排序规则的函数
    function rule(a,b){
      if(a<b){
        //如果要让a出现在b之前,返回小于0的数
        return -1
      }else{
        return 1;
      }
      //可以将以上的if语句  写为  return a-b;
    }
    arr.sort(rule);
    console.log(arr);
    //结果为:[1,4,7,23,300]
     

    splice()删除元素,并向元素添加新的项目,返回值为被删除的项(用于删除中间的项目)

     
     
     
     
     
    //删除作用
    var arr=[23,1,300,7,4];
    var result=arr.splice(2,1);   //()前面那个代表被删除的项处于的某一项,后面那个为需要删除多少项,返回值为被删除的内容。
    console.log(arr);
    console.log(result);
    //结果为:[23,1,7,4]
    //       [300,7]
    //替换作用
    var arr=[23,1,300,7,4];
    var result=arr.splice(2,1,100,200);   //添加的个数不限
    console.log(arr);
    //结果为:[23,1,100,200,7,4]
    //插入功能
    var arr=[23,1,300,7,4];
    var result=arr.splice(3,0,100,200);   //替换的内容为()中定义的第一个数字的的位置
    console.log(arr);
    //结果为:[23,1,300,100,200,7,4]
     
  • 相关阅读:
    jquery ajax 向后台传递数组
    定时任务
    C# 好用的插件
    C# 跳出循环
    存储区更新、插入或删除语句影响到了意外的行数(0)。实体在加载后可能被修改或删除。刷新 ObjectS
    Opencv2.4.9源码分析——HoughLinesP
    OpenCV+C++ 视频图片相互转换
    opencv2.2版本不稳定
    OpenCV 透视变换【图像归一化矫正】
    opencv配置注意事项【总结】
  • 原文地址:https://www.cnblogs.com/cswzl/p/5990457.html
Copyright © 2011-2022 走看看