JavaScript中的函数与作用域
函数
- 函数是什么
函数是这样的一段JavaScript代码 它只定义一次 但可能被执行或调用多次
简单来说 函数就是一组可重用的代码 可以在程序的任何地方调用
定义函数
- 函数声明方式
定义函数时 函数体的内容是不会被执行的
function fun(){ console.log('这是一个函数'); }
- 字面量/直接量方式
var fun = function(){ console.log('这是一个函数'); }
调用函数
定义一个函数并不会自动的执行它 定义了函数仅仅是赋予函数以及名称并明确函数被调用时该做些声明 调用函数才会真正执行这些动作
- 定义一个函数fun
function fun(){ console.log('这是一个函数'); }
- 调运函数
fun(); //输出字符串:这是一个函数
函数的参数
函数的参数就相当于在函数中使用的变量(虽然这个比方不是很准确) JavaScript中的函数定义并未制定函数参数的可续 函数调用时也为对传入的参数做任何的类型检查
- 函数的参数分为形参和实参
形参:出现在函数定义文法中的参数列表是函数的形式参数 简称形参 简单的说 就是定义函数使用的参数就是形参
1.形参的定义方式 类似于变量的(不需要任何关键字)
2.形参默认未定义任何值时 - undefined
实参:函数调用时实际传入的参数是函数的实际参数 简称实参 简单的说 就是调用函数时使用的参数就是实参
function fun( one, two){ console.log( one, two); } fun(1, 2); //输出 3 //定义函数fun时 one和two就是函数的形参;调用fun时 1和2就是函数的实参
形参与实参的区别:
1.形参的个数与实参不一定是一致的
2.形参的个数多于实参的个数 多余的形参没有值(默认为 undefined)
3.实参的个数多于形参的个数 多余的实参没有对应的形参
4.形参与实参根据站位符进行一一对应
return语句
函数的return语句:
1.并不是必要的 可有可无
2.作用:作为函数的返回值(数据内容)
3.用法:一般会被编写在函数体的最后面
4.的确允许不编写在函数体的最后面
5.一旦return语句不在函数体的最后面 return语句之后的代码都不再执行
function fun(){ console.log('这是一个函数'); return 100; } console.log(fun());/* 打印函数调用的结果 */ console.log(fun);/* 打印变量的值 */ function fn(){ console.log('这是return语句之前...'); return; console.log('这是return语句之后...'); } var result = fn(); console.log(result);
预定义函数
JavaScript预定义了一组函数 又称为全局函数 允许直接使用
- eval()函数
eval()函数用于执行以字符串(String)形式出现的JavaScript代码
作用:讲一个字符串类型的JavaScript代码转换为真正的JavaScript代码
var str = 'console.log("这是一段代码...")'; eval(str);
- decodeURI()函数
对已编码的统一资源标识符(URI)进行解码 并返回其非编码形式
var uri="http://www.qianduan.com/web%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91"; var decode=decodeURI(uri); /*输出结果:http://www.qianduan.com/web前端开发,对后面的编码进行解码成中文*/ console.log(decode);
- encodeURI()函数
对统一资源标识符(URI)进行编码 并返回编码后的URI字符串
var uri="http://www.qianduan.com/web前端开发"; var encode=encodeURI(uri); /*输出结果:http://www.qianduan.com/web%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91 对后面中文部分进行编码 */ console.log(encode);
作用域
- 作用域是什么
变量和函数都具有作用域 作用域就是变量和函数的可被访问的范围 控制着变量和函数的可见性和生命周期
变量的作用域可被分为全局作用域和局部作用域(函数作用域) 如果变量是被定义在全局作用域的话 在JavaScript代码中的任何位置都可以访问该变量 如果变量被定义在指定函数内部 在JavaScript代码中只能在该函数内部访问该变量
函数的作用域也可被分为全局作用域和局部作用域(函数作用域) 被定义在指定函数内部的函数被称为局部函数或内部函数
变量的作用域
- 全局变量
在所有函数之外声明的变量 叫做全局变量 因为他可以被当前文档中的其他代码所访问
var str='wolongqianduan';//定义全局变量str //在全局作用域访问全局变量str //输出结果:字符串的wolongqianduan console.log(str); function fun(){ //在函数作用域访问全局变量str //输出结果:字符串的wolongqianduan console.log(str); } //调用fun fun();
- 局部变量
在函数内部声明的变量 叫做局部声明 因为它只能在该函数内部访问
var num = 200; /* * 局部变量 - 作用于当前函数作用域中 * 局部变量的值 - 只能在当前函数作用域进行初始化 * 函数的参数 - 作用于当前函数体中 * 参数的值(实参) - 在全局作用域中传递的 */ function fun(a){ var v = 100; console.log(v + a); } fun(num);
- 按值传递
按值传递就是指将实参变量的值复制一份副本给函数的形参变量 在JavaScript中为函数传递参数是 都是按值传递的
如果向函数传递的参数是原始类型数据 则在函数中修改参数变量的值 不会影响外部实参的变量
/* 按值传递 */ var num = 100;/* 定义一个全局变量 */ /* 定义一个函数 */ function fun(num){/* 形参 */ num++; console.log('这是函数内部的值: ' + num);// 101 } /* 调用指定函数 - 实参传递的是全局变量的值 */ fun(num);/* 实参 */ /* 调用指定全局变量 */ console.log('这是全局作用域的值: ' + num);// 100 var v = 200; function fn(){ v++; } fn(); console.log(v);// 201
声明提前
JavaScript变量的另一种特别之处 可以引用后面声明的变量 而不会引发异常 这一概念成为变量声明提前
JavaScript变量感觉上是被举起或提升到了所有函数和语句之前 然而提升后的变量将返回undefined值 所以即使在使用或引用某个变量之后存在声明和初始化操作 仍得到undefined值
- 全局变量与局部变量声明
/* 声明提前 console.log(num); - 先调用 var num = 100; - 再定义 以上代码等价于以下代码 var num; - 定义变量,但未初始化值 console.log(num); - 调用变量 num = 100; - 变量初始化值 */ console.log(num);// undefined var num = 100;/* 定义全局变量 */ /* 定义函数 */ function fun(){ // 全局变量与局部变量同名时 - 在当前函数作用域中只能访问局部变量 console.log(num);// undefined var num = 200;/* 定义局部变量 */ // 就近原则 console.log(num);// 200 } /* 调用函数 */ fun(); // 局部变量在全局作用域中无法访问 - 只能访问全局变量 console.log(num);// 100
函数的作用域
- 全局函数
函数与变量类似 具有全局作用域和函数作用域(局部作用域)与全局变量相似 全局函数是被定义在全局作用域的 任何位置都可以访问或调用该函数
function fun(num1,num2){ console.log(num1+num2);//输出 3 } fun(1,2);
- 内部函数
一个函数被定义在另一个函数的内部 被称为局部函数或者内部函数 与变量相似 局部函数只能在当前函数内部访问 而不能在全局作用域中被访问
function outer(){//全局函数 function inner(){//局部函数 console.log('inner'); } inner();//调用正常 } inner();//输出报错