JS再学习之变量和函数

347 阅读4分钟

再探JS之变量

变量的作用:

计算机保存数据时,相当于在把内存分成一个个小格子,数据放在小格子里,每个小格子有一个地址,而变量相当于给这些小格子起了不同的名字,根据名字,就能很方便的找到数据。

变量的声明:

可以使用var来声明变量,一次可以声明一个,也可以声明多个,但是使用var声明变量会存在重复声明,遗漏声明,变量提升等不方便的地方,所以在ES6以后,更推荐使用let和const来声明变量。在ES6中出现了块级作用域,使用let和const可以定义块级作用域。如果在let和const声明之前访问对应的常量,会抛出ReferenceError错误,因为let和const声明的变量和常量不存在提升现象。

变量的命名规则:

变量名必须以英文字母,下划线或$符号开头。变量名可以包括英文字母、下划线、$符号和数字。不能使用系统的关键字、保留字作为变量名。

ES6还规定了如果一个区块中存在let和const声明的变量,那么会形成一个封闭的作用域,在这个区域外部都无法使用这些变量。在语法上称之为“暂时性死区”。const用来声明常量,在声明之后,该变量的值将无法修改。所以使用const声明时必须给变量赋值。另外,使用let和const不能重复声明。

全局变量和局部变量:

全局变量在函数内外都可以访问。局部变量只能在函数内部访问。

数据类型:

为了合理的使用内存空间,把数据分成两大类:基本数据类型,包括number,string,boolean,undefined和null。引用数据类型,objec(array和function)。基本数据类型存放在栈区,引用数据类型存放在堆区。

再探JS之函数

函数实质上就是一个代码块,可以实现特定的功能。函数也是一类数据,也是一个对象。

函数的声明

直接声明,使用关键字function来声明一个函数,基本格式:

    function f (参数){
        函数体
    }

f是函数名,函数命名有小驼峰命名法:toString()、大驼峰命名法:ToString()、下划线命名法:to_string()。 使用函数表达式声明函数

<script>
var hello = function(){
    alert("hello!");
}
// 调用
hello();
</script>

区别:如果使用的是直接声明,调用可以在声明前,使用表达式声明需要先定义,然后才能调用。

函数的调用

如果定义号一个函数,需要调用它,它才会执行函数体中的代码,如果没有调用,相当于没有写。

作为函数调用,是最简单的情况,调用自定义函数,直接用函数名调用:f()。

作为方法调用:将函数定义到某个具体的对象上面,然后通过语法来进行调用。

<script>
 window.alert("作为window对象的一个方法");
</script>

函数的参数

形参:函数定义时,函数名后面的()中写的参数,相当于函数内部的局部变量,作用是用来接收实参。

实参:函数调用时,()中写的参数,作用是给函数传递真实的数据,由形参接收。

实际上,JS是一门弱类型的语言,具体体现在:

  • 变量在声明的时候,不需要指定类型。
  • 函数中的参数,在声明的时候也不需要指定类型。

函数的返回值

通过return返回,返回到函数的调用处,在函数体中,return后面的代码就不会再执行了,return也叫跳转语句。

作用域

作用域是针对变量而言的,要定义一个变量,这个变量就有一个相应的作用域。在JS中,作用域分两类:全局作用域,局部作用域(函数内部会形成一个局部作用域,也叫函数作用域)。在局部作用域中(函数内部)可以访问全局作用域的变量,在全局作用域(函数外部)不能访问局部作用域的变量(函数内部定义的变量)。

参数的传递

基本数据类型的数据(值传递):就是把栈区的数据copy一份给了形参,改变了形参的值。

引用数据类型的数据(引用传递):就是把栈区的地址copy一份给了形参,形参和实参同时指向堆区同一个内存空间。通过形参改变堆区内存空间的数据,实参这个地址对应的数据也会发生改变。