一、arguments 对象伪数组
这个伪对象可以替换 函数传入的任何参数如下:
<script>
function f() {
console.log(arguments)
}
f(1,2,3,4,5,6)
</script>
伪数组传入数据
二、函数的其他定义形式
函数的命名方式
1、命名函数
定义:函数有名字,就是命名函数;
2、匿名函数
定义:函数没有名字,匿名函数;
函数表达式
定义:把匿名函数赋值给一个变量而形成的表达式;
<script>
var fun = function () {
console.log("我是一个匿名函数")
};
fun()
</script>
函数表达式
注意:
1、函数表达式,调用两次,则可以出现两次结果
<script>
var f1 = function () {
console.log("函数一")
};
f1();
f1 = function () {
console.log("函数二")
};
f1();
</script>
注意事项
同名函数调用两次,只会执行一个函数,并且是最后面的函数
<script>
function f1() {
console.log("函数一")
};
f1();
function f1() {
console.log("函数二")
};
f1();
</script>
注意事项
2、声明函数之后直接调用
<script>
(function () {
console.log("直接调用的函数")
})();
</script>
直接调用的函数
3、函数也是一种数据类型
类型为 function
4、回调函数
定义:将函数作为参数使用,则为回调函数
<script>
function f1() {
}
function f2() {
console.log("打印函数 2")
}
f1(f2());
</script>
函数作为参数使用
5、函数作为返回值
当函数作为返回值的时候,需要用一个变量去接收这个函数的返回值,否则调用毫无意义;
代码如下:
<script>
function f1() {
console.log("带有返回值的函数");
return function () {
console.log("这是一个函数返回值")
}
}
var ff = f1();
ff();
</script>
image.png
三、函数的作用域
1、全局变量
定义:使用 var 定义的变量为全局变量,全局变量可以在页面内任何地方使用。
注意:全局变量,如果页面不关闭,则一直不会被释放,导致一直占用内存空间,消耗内存。
2、局部变量
定义:在函数内定义的变量为局部变量,外部不可以进行使用。
注意:局部变量 当函数调用完成之后,局部变量就会消失。
3、全局作用域
定义:全局变量的使用范围。
4、局部作用域
定义:局部变量的使用范围。
5、块级作用域(js 没有块级作用域)
定义:一对大括号就可以看成是一块作用域。js 在一对大括号内定义的变量可以在大括号外面进行使用,所以 js 内没有块级 作用域。
6、隐式全局变量
定义:声明变量没有var ,就叫做隐式全局变量
全局变量不可被删除,隐式全局变量可以被删除;
四、作用域链
函数内嵌套函数并且被调用,从而形成作用域链
<script>
var num = 10;
function f1() {
var num = 20;
function f2() {
var num = 30;
function f3() {
var num = 40;
console.log("num:" + num)
}
f3()
}
f2()
}
f1();
</script>
作用链
同名变量 使用为 就近原则。
五、预解析
预解析:就是在解析代码之前
预解析作用:把变量和和函数声明提前到当前所在的作用域的最上面。
函数声明提前,依然可以起作用,而变量提前则会产生 undefined 结果;
预解析分段 (多段 script 标签内的重名函数,不干涉);
案例:
<script>
f1();
console.log(c);
console.log(b);
console.log(a);
function f1() {
var a = b = c = 9;
console.log(a);
console.log(b);
console.log(c);
}
</script>
结果:
由于 预解析的存在 导致 b、c为 隐式全局变量,而 a 为局部变量,所以 a 报错,其他的显示正常值
Android 程序员搞 js 之 基础(十 一) 难点
欢迎关注.jpg
网友评论