1.函数的定义
为什么要用到函数?
封装重复性代码,解决冗余
函数的形式
function fn(){
//执行的代码
}
函数用function关键字声明(就像用var声明变量),fn是函数的名字(可以自定义,注意命名规范),{ }是函数执行体,存放执行代码.
函数的调用
函数创建之后还需要调用,直接用**函数名()**进行调用
例子
function sayHello(){
alert("hello world");
}
sayHello();//调用
2.函数传参
函数中还可以传入参数(这些参数称为形参,作为实参的管道入口)
eg:
function say(name){
alert("hello"+name)
}
say("john");
函数可以接收多个参数,可以是任意类型,但是一般不要多余4个。
3.函数返回值
在函数中用return(作为管道出口)来返回函数的执行结果。
eg:
function add(a,b){
return a+b;
}
add(1,2);//3
4.函数表达式
是创建函数的一种写法(详细请看函数的几种创建方式),将一个匿名函数赋值给一个变量
var add=function(a,b){
return a+b;
}
add();
5.函数作用域
1.全局作用域
在函数外定义的变量,既可以在函数外使用,也可在函数内部使用。
eg:
var name='john';//全局变量
function sayHello(){
console.log("hello"+name)//局部使用
};
sayHello();
console.log(name);//全局使用
2.局部作用域
在函数内声明的变量,只能在函数内部使用。
eg:
function sayGood(){
var word="good";//局部变量
console.log("hello"+word);//局部使用
}
sayGood();
console.log(word);//报错
tips:形参也是局部变量。
特殊情况
有时函数内部未用var关键词声明变量,此时此变量将作为全局变量使用。
eg:
function say(){
name='john';
console.log(name);
}
console.log(name);//john
say();
3.全局污染
不同的js文件如果使用了相同的全局变量,或者定义了相同名字的函数,就会造成命名冲突,后调用的会覆盖前调用的,称之为全局污染。
如下:
<script src="first.js"></script>
<script src="second.js"></script>
<script>
hello();//jack
</script>
first.js中的代码为
var name='john';
function hello(){
console.log(name);
}
second.js中的代码为
var name="jack";
function hello(){
console.log(name);
}
如何解决全局污染
可以用自执行函数( ) ( ),改变作用域。
此时first.js代码为
(function(){
var name='john';
var hello=function hello(){
console.log(name);
window.first = hello;
}
})();
同理second.js代码为
(function(){
var name="jack";
var hello=function hello(){
console.log(name);
window.second=hello;
}
})();
调用:
<script src="first.js"></script>
<script src="second.js"></script>
<script>
first();//john
second();//jack
</script>