欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

JS函数浅析(一)

程序员文章站 2022-11-21 17:51:35
1.万物皆为对象 提起函数首先要知道对象,而对象又是js数据类型中的一种,所以我们从头开始。 1)javascript数据类型有哪些? 原始数据类型:number,undefined,null,string,boolean 引用数据类型:object 2)数据类型的检测: typeof(需要检测的内 ......

 

1.万物皆为对象

  提起函数首先要知道对象,而对象又是js数据类型中的一种,所以我们从头开始。

  1)javascript数据类型有哪些?
          原始数据类型:number,undefined,null,string,boolean

     引用数据类型:object

 

  2)数据类型的检测:
    typeof(需要检测的内容) -- number,string,boolean,function,object,undefined (返回的结果都是string类型)。 

    typeof(null)    返回的结果为object

 

  3)引用数据类型:

  对象都有自己的属性和方法: 

function fun(a,b,c){    //函数类对象
                
}
console.log(fun)   //fun它也是window对象底下的属性
//fun自己的属性
    console.log(fun.name)   //输出函数的函数名
    console.log(fun.length) //形参的个数
    console.log(fun.prototype)   //原型

//函数也是可以直接当成对象使用的 
//对象的增删查改
    fun.abc = 123;         //增
   fun.bcd = function(){    //增一个特殊的元素
      console.log("hello")
   }
   fun.bcd(); fun.abc;   //查 fun.abc = 456;  //改 console.log(fun.abc);
delete fun.abc;    //删

   


  4)原始数据类型:

    可以改变的引用类型,和不可以改变的原始类型(这个地方的改变和不改变表示的是存储结构);


//一定是会改变存储的地址

var str = "hello world";

str = 123;
console.log(str);
//对象里面去增加属性和方法是不会改变存储的地址的
var obj = {  
}
obj.abc = 123;

    原始类型属性的添加;


var str = "hello world";
str.abc = 123; //自己添加属性
console.log(str.length)   //自己自带的属性
           
console.log(str.abc)  //原始类型不能添加属性,如果添加,不会报错,添加完成系统检测为原始类型后马上删除

    当用new的方式创建一个字符串时:(此时为一个对象,数据类型自然变成了引用数据类型)

var str2 = new string("hello world");    //一定出来的是对象
console.log(str2.length)
str2.abc = 456;
console.log(str2.abc);

   number等其他类型也一样:

 var num = 123;
 num.abc = 456;
 console.log(num.abc)
            
 var numobj = new number(123);
 numobj.abc = 456;
 console.log(numobj.abc)

  实例:

var str = "hello world";
            
            var len = typeof(str);    
            
            if(len.length == 6){
                len.abc = "typeof检测的结果为string类型";    
            }
            
            console.log(len.abc);     //最后输出的是什么?
输出的是undefined,len.length=6可以走进循环,只是len是原始数据类型,可以添加,但是添加完成马上就删除了。


2.函数作用域

在javascript中,es6以前有三种情况:
 1.全局作用域

  var num = 100;
   function fun(){
     console.log(num)
     var num1 = 200;
     function fun2(){
       console.log(num1);
     }
   }
  fun()

    使用var声明的变量不是全局就是局部,不是用var声明的变量都是全局变量
   

   2.函数作用域 (局部作用域)

function fun(){    
   num = 100;
}
fun(); 
console.log(num);

    函数如果不调用,永远不会执行,管你里面的代码是什么东西,再多的错误不执行也是不会抛出的

 

   3.es6中有块级作用域

  过去,javascript缺乏块级作用域,var声明时的声明提升、属性变量等行为让人困惑。es6的新语法可以帮助我们更好地控制作用域。(这一部分待后续完善)

 

3.函数声明和函数表达式

  函数声明

    function fun(){  
                                      //函数声明
    }        

  函数表达式

  var abc = function fun(a,b,c,d){    //函数表达式
       console.log("hello")
    }

// 调用abc?fun?
   abc();
   fun();        //会报错

   console.log(abc.name) //除了这个地方可以看到fun以外,其他没有任何用处
   console.log(fun.name)//会报错

   console.log(abc.length)
   console.log(fun.length)

    abc这个时候就是一个函数,当abc变成了表达式以后,函数就会放弃自己的名字,所以要调用abc()。

函数表达式和函数声明的区别:

function fun(){    //函数声明
   console.log("hello");
 }()

  函数表达式是直接可以被执行符号执行的,在函数的前面可以加上+-!可以让函数声明变成函数表达式

+function fun(){    //函数声明变成函数表达式
   console.log("hello");
 }()

-function fun(){    
   console.log("hello");
 }()

!function fun(){   
   console.log("hello");
 }()

 

 

4.立即执行函数

1.特点:

  1.函数声明了以后直接自己执行,用函数的返回值,适合做初始化的工作
  2.避免写全局变量,所有的内容全部都放在立即执行函数中

2.格式

//1.
(function(){})()

//2.
(function(){
                
}())

  3.功能:

   1)初始化

//1加到100的值
var he = (function(n){
    var num = 0;
    for(var i = 1;i<=n;i++){
        num+=i;
    }
    return num;
})(100);

   2)功能型

   写功能型的时候,在立即执行函数前面加上分号
;(function(){       console.log(456)})()

 

 

 

 

 

 

上一篇: 里氏替换原则

下一篇: 我有