函数:
一段 JavaScript 代码,它只定义一次,但可能被执行或调用多次。函数就是一组可重用的代码。
函数的定义:
/*
函数定义,先定义在调用
函数声明方式
function 函数名(){ 函数体 } */ function fn1(){ console.log('this is text'); } /* 字面量的方式定义 var 函数名=function(){ 函数体 } */ var fn2=function () { console.log('this is text'); } var fn3=function(){} /*
javaScript是弱类型或松散类型
当变量定义为初始化时 ,变量的值的类型不确定
当变量被初始化时,类型确定
*/
函数的调用
定义一个函数并不会自动的执行它。定义了函数仅仅是赋予函数以名称并明确函数被调用时该做些什么。调用函数才会真正执行这些动作。
1 //1.声明方式
2 function fn1() {
3 console.log('this is text');
4 }
5 //函数的调用
6 fn1();
7 //2.字面量方式
8 var fn2=function () {
9 console.log('this is text');
10 }
11 //函数的调用
12 fn2();
13 函数与变量
14 //变量与函数同名时,出现覆盖和别覆盖的现象
15 var fn='this is text';
16 console.log(fn);
17 var fn=function () {
18 console.log('this is function');
19 }
20 console.log(fn);//函数将变量覆盖
21 fn();
22
23 var fn='this is text';
24 console.log(fn);
25 function fn() {
26 console.log('this is function');
27 }
28 console.log(fn);//变量没有被函数覆盖
29 fn();//调用函数,fn不是一个函数
函数参数
函数的参数就相当于在函数中使用的变量(虽然这个比方不是很准确)。JavaScript 中的函数定义并未制定函数参数的类型,函数调用时也未对传入的参数做任何的类型检查。函数的参数可以分为以下两种:
-形参: 出现在函数定义文法中的参数列表是函数的形式参数,简称形参 。简单来说,就是定义函数时使用的参数就是形参。
-实参: 函数调用时实际传入的参数是函数的实际参数,简称实参。 简单来说,就是调用函数时使用的参数就是实参。
1 //函数的定义-形参:在函数体中,形参可以类似于变量的使用
2 // 函数的形参:在函数体外,是无法被访问(调用)的
3 /*function fn(a) {
4 console.log(a)
5 }
6 */
7 // 函数的调用 - 实参:在函数体中,定义对应形参的值
8 // fn(100);
9
10
11 // var a=100;
12 // function fn() {
13 // console.log(a);
14 // }
15 // fn();
16
17
18 // 在函数的函数体外,也可以被正常访问(调用)
19 // console.log(a);
20 // function fn() {
21 // var a=100;
22 // console.log(a);
23 // }
24 // fn();
25 // console.log(a);
26
27 // 在函数体中定义的变量,不能用于函数体外
28 // function fn(){
29 // var a = 100;// 变量的定义
30 // console.log(a);
31 // }
32 // fn();
33 // console.log(a);
return 语句
函数还可以包含一个返回语句(return)。当然,这并不是必需的。return 语句使函数可以作为一个值来使用
1 var fn=function () {
2 var a=100;
3 console.log('xxx');
4 return 200;
5 // 函数的返回值 return,尽量定义在函数体的最后面
6 // 如果定义的代码在 return 语句之后,不会被执行
7 }
8 //变量的调用方式
9 console.log(fn);//输出function的类型
10 fn();//函数的调用方式
11 console.log(fn());//将函数的调用结果,输出打印
12 预定义函数
13 // 定义一个字符串类型的JavaScript代码
14 eval(str);
15 var str="console.log(\"this is test.\")"
16 // 将JavaScript代码当作普通的文本内容输出
17 eval(str);
编码解码问题
1 var uri="http://www.atguigu.com/Web前端开发工程师"
2 //涉及中文,不能被正确显示或使用
3 var encode=encodeURI(uri);// 对字符串进行编码
4 console.log(encode);
5 var decode=decodeURI(encode);// 对字符串进行解码
6 console.log(decode);
作用域
变量和函数都具有作用域。作用域就是变量和函数的可被访问的范围,控制着变量和函数的可见性和生命周期。
变量的作用域
全局变量
在所有函数之外声明的变量,叫做全局变量
1 //全局变量-被定义在全局作用域的变量
2 // var str='this is text';//在全局作用域中允许访问
3 // console.log(str);
4
5 function fn() {
6 //在函数作用域中访问
7 var str='this is function';
8 console.log(str);
9 }
10 fn();
11 //在全局作用域(非函数作用域)中不能访问局部变量
12 console.log(str);
13 局部变量
14 在函数内部声明的变量,叫做局部变量
15 // 在函数作用域中,定义局部变量,不使用 var 关键字时 - 自动提升为全局变量
16 function fn() {
17 // 定义局部变量 - 这种不使用 var 关键字,在严格模式下是不允许的
18 var str='this is function';
19 console.log(str)
20 }
21 fn();
22 // 在全局作用域中 - 该变量是全局变量
23 console.log(str)
24
25 function fn() {
26 console.log(str);//undefined
27 var str='this is text';
28 console.log(str);// this is text*/
29 }
30 fn();
声明提前
1 // console.log(str);
2 // var str='this is text';
3 // console.log(str);
4 function fn() {
5 console.log(str);//undefined
6 var str='this is text';
7 console.log(str);// this is text*/
8 }
9 fn();
按值传递
按值传递就是指将实参变量的值复制一份副本给函数的形参变量。JavaScript 中为函数传递参数时,都是按值传递的。如果向函数传递的参数是原始类型数据,则在函数中修改参数变量的值,不会影响外部实参的变量。
1 var str=100;//定义全局变量
2 // 函数的形参 - 函数体中改变的都是形参的值,与全局变量无关
3 function fn(str) {
4 console.log(str);//100
5 str = str -10;
6 console.log(str);//90
7 }
8 fn(str); //函数的实参对应的是全局变量
9 console.log(str);//100
全局函数
函数与变量类似,具有全局作用域和函数作用域(局部作用域)。与全局变量类似,全局函数是被定义在全局作用域的,在任何位置都可以访问或调用该函数。
function fn( num1, num2){ console.log( num1 + num2 );// 输出 3 } fn( 1, 2 );
内部函数
function fn () {
//内部函数
function n() {
// 在函数作用域中定义的函数 - 内部(私有)函数
console.log('this is function');
}
// 在当前函数作用域中允许访问
n();
}
fn();
// 在指定函数作用域外,不允许访问
n;