自己再总结的:函数声明有函数声明和表达式声明,表达式声明不会前置。
定义变量不加var 则是全局变量。
函数声明
function functionName(){
statement;
}
使用function
关键字可以声明一个函数,看个例子
function printName(){
console.log('Byron');
}
printName();
函数表达式
var printName = function(){
console.log('Byron');
};
区别在于:
a.函数声明会在任何表达式被解析和求值之前先被解析和求值,即使声明在代码的最后一行,它也会在同作用域内第一个表达式之前被解析/求值。示例:
<pre>
alert(fn());
function fn() {return 'Hello world!';}
</pre>
b.函数声明在条件语句内虽然可以用,但是没有被标准化,也就是说不同的环境可能有不同的执行结果,所以这样情况下,最好使用函数表达式:
c.函数声明的syntax:
<pre>function 函数名(){}</pre>
函数表达式的syntax:
<pre>var 变量名=function 函数名(){};</pre>
函数声明结尾没有分号,但是函数表达式以分号结尾。
在函数内部,你可以使用arguments
对象获取到该函数的所有传入参数
function printPersonInfo(name, age, sex){
console.log(name);
console.log(age);
console.log(sex);
console.log(arguments);
}
变量的声明前置:JavaScript引擎的工作方式是,先解析代码,获取所有被声明的变量,然后再一行一行地运行。这造成的结果就是所有的变量的声明语句,都会被提升到代码的头部,也称为变量提升。
函数的声明前置:函数声明过程在整个程序执行之前的预处理就完成了,所以只要在同一作用域,就可以访问到,即使在定义之前调用也可以。
声明提前
和变量的声明会前置一样,函数声明同样会前置,如果我们使用函数表达式那么规则和变量一样
console.log(fn); //undefined
var fn = function(){}
如果我们使用函数声明的方式,那么即使函数写在最后也可以在前面语句调用,前提是函数声明部分已经被下载到本地
fn(); // "1"
function fn(){
console.log('1');
}
重载
在JavaScript中没有函数重载的概念,函数通过名字确定唯一性,参数不同也被认为是相同的函数,后面的覆盖前面的,这是不是意味着JavaScript不能通过重载功能实现一个函数,参数不同功能不同呢?
在JavaScript中,函数调用没必要把所有参数都传入,只要你函数体内做好处理就行,但前提是传的参数永远被当做前几个
function printPeopleInfo(name, age, sex){
if(name){
console.log(name);
}
if(age){
console.log(age);
}
if(sex){
console.log(sex);
}
}
printPeopleInfo('Byron', 26);
printPeopleInfo('Byron', 26, 'male');
JavaScript没有重载函数这个概念,但是可以通过arguments来模拟函数重载。实现代码示例:
<pre>
function sum(){
var sum=0;
for(var i=0;i < arguments.length;i++){
sum+=arguments[i];
}
return sum;
}
sum(1,2);
</pre>
命名冲突
当在同一个作用域内定义了名字相同的变量和方法的话,会根据前置顺序产生覆盖
var fn = 3;
function fn(){}
console.log(fn); // 3
相当于
var fn
function fn(){} //覆盖上面的
fn = 3 //重新赋值
console.log(fn)
当函数执行有命名冲突的时候,可以认为在还是内部一开始有隐藏的声明变量这个操作
function fn(fn){
console.log(fn);
var fn = 3;
console.log(fn);
}
fn(10); //10 3
JavaScript的作用域是靠函数来形成的,也就是说一个函数内定义的变量函数外不可以访问
function fn(){
var a =1;
if(a > 2){
var b = 3;
}
console.log(b);
}
fn(); // undefined
console.log(a); // "ReferenceError: a is not defined
var
在声明变量的时候需要var
,这样声明的变量作用域才符合我们上面提到的规则,那么不写var会怎么样呢
function fn(){
a = 1;
}
fn();
console.log(a); // 1
可以看到不写var会声明一个全局的变量,这是我们在编程中应该要避免的,即使真的需要全局变量,也应该在最外层作用域使用var声明
作者:betterwlf
链接:https://www.jianshu.com/p/70a7c75b863e
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
作者:betterwlf
链接:https://www.jianshu.com/p/70a7c75b863e
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。