1、函数中的两种命名方式:
1、利用函数关键字function自定义函数(命名函数)
function fu(){
}
fn();
2、利用函数表达式(匿名函数)
var 变量名=function (){};
var fn=function (arguments){
console.log('我是函数表达式');
console.log(arguments);
}
fn('你好');//输出:我是函数表达式and你好;
对于如上代码注意:
- 1、fn是变量名,不是函数;
- 2、函数表达式声明方式跟声明变量差不多,只不过变量里面存的是值而函数表达式里存放的是可调用的函数;
- 3、函数表达式也可以进行传递参数。
2、JavaScript作用域
1.JavaScript作用域﹔就是代码名字(变量)在某个范围内起作用和效果,目的是为了提高程序的可靠性更重要的是减少命名冲突、
2.js的作用域分:全局作用域和局部作用域
- 全局作用域:类似整个script标签或者是一个单独的js文件。
- 局部作用域(函数作用域)在函数内部就是局部作用域,这个代码的名字只在函数内部起效果和作用。
var num=1
function fn(){
//局部作用域
var num=100;
console.log(num);
}
console.log(num);
fn(num)
输出结果为:1and100;
透过不同的结果可以看出局部作用域不受全局作用域的影响。
3、全局变量与局部变量
A:全局变量
- 在全局作用域下声明的变是叫做全局变量(在函数外部定义的变量)。全局变量在代码的任何位置都可以使用
- 在全局作用域下用var声明的变量是全局变量
- 特殊情况下,在函数内不使用var声明的变量也是全局变量(不建议使用)
B:局部变量
- 在局部作用域下声明的变量叫做局部变量(在函数内部定义的变量)
- 局部变量只能在该函数内部使用
- 在函数内部var声明的变量是局部变量,函数的形参实际上就是局部变量。
4、作用域链
- 只要是代码,就至少有一个作用域;
- 写在函数内部的局部作用域;
- 如果函数中还有函数,那么在这个作用域中就又可以诞生一个作用域;
- 根据在内部函数可以访问外部函数变量的这种机制,用链式查找决定哪些数据能被内部函数访问,就称作作用域链。
案例:
<script>
var a = 1;
function fn1() {
var a = 2;
var b = '22';
fn2();
function fn2() {
var a = 3;
fn3();
function fn3() {
var a = 4;
console.log(a);
console.log(b);
}
}
}
fn1();//输出4and'22'
</script>
5、JS预解析
1.js引擎运行js分为两步:A:预解析B:代码执行;
(1).预解析 JS 引擎会把JS里出所有var还有function提升到当前作用域的最前面
(2).代码执行按照代码书写的顺序从上往下执行
2.预解析分为变量预解析(变量提升)和函数预解析(函数提升)
(1)变量提升就是把所有的变量声明提升到当前的作用域最前面不提升赋值操作
(2)函数提升就是把所有的函数声明提升到当前作用域的最前面,但不调用函数。
对于不提升赋值操作解释:
console.log(num);
var num=0;//返回undefined。原因是预解析将变量声明提升到了作用域的最前面此时num为未赋值的变量
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)