JavaScript 知识整理(五) 函数
目录
一、函数定义
- 方法一
function abs(x) {
if (x >= 0) {
return x;
} else {
return -x;
}
}
- 方法二
var abs=function (x){
if (x >= 0) {
return x;
} else {
return -x;
}
}
注意:
- function(x){...}是一个匿名函数,函数值传递给abs
- 不严谨的js允许传递任意个参数,但是只从前往后匹配参数,这些参数都存在argument对象里。
二、变量作用域
- 函数中的变量具有局域性
- 函数嵌套时,内函数可以访问外函数变量,外函数无法访问内函数变量
function f1(){
var x=1;
function f2(){
var y=x+1; //有效 y=2
}
var z=y+1; //无效
}
- js所有变量都放在函数前面,方便维护。
- 全局变量
由于外函数的变量可以在内函数中使用,所以全局变量就是定义在所有函数之前的变量,也就是<script>便签头部。所有的全局变量都默认属于windows对象的属性。比如下方输出依旧正确。
<script>
var x=1;
console.log(windows.x);
</script>
三、let 关键字
在ES6之前,我们都是用var来声明变量,而且JS只有函数作用域和全局作用域,没有块级作用域,所以{}
限定不了var声明变量的访问范围。例如:
{
var i = 9;
}
console.log(i); // 9
ES6新增的let
,可以声明块级作用域的变量。
{
let i = 9; // i变量只在 花括号内有效!!!
}
console.log(i); // Uncaught ReferenceError: i is not defined
这个let在for循环中有较好的使用效果
// i虽然在全局作用域声明,但是在for循环体局部作用域中使用的时候,变量会被固定,不受外界干扰。
for (let i = 0; i < 10; i++) {
setTimeout(function() {
console.log(i); // i 是循环体内局部作用域,不受外界影响。
}, 0);
}
// 输出结果:
0 1 2 3 4 5 6 7 8 9
四、方法定义
方法就是将函数放到对象内部
var dog{
age:4 month;
eat: function(){
console.log("吃东西");
}
}
dog.eat(); //调用方法
同时,函数还存在变量提升和暂时性死区两个概念。