函数的定义和参数获取
-
定义函数
①用函数声明来创建函数(常用!)
语法:
function 函数名([形参1,形参2……形参n]){
语句……
}
function fun1(){
console.log("第一个");
}
fun1();//调用
②构造函数
var fun1 = new Function("console.log('第一个');");
fun1();//调用函数
③用函数表达式(匿名函数)
语法:
var 函数名 = function([形参1,形参2……形参n]){
语句……
}
var fun1 = function(){
console.log("第一个");
};//相当于赋值语句
fun1();//调用函数
参数问题:规避参数不存在问题
var abs = function(x) {
//手动抛出异常来判断
if(typeof x!=='number') {
throw 'Not a Number';
}
if(x>=0) {
return x;
} else {
return -x;
}
}
-
arguments
arguments是一个类数组对象(不是数组),也可通过索引操作数据,获取长度
function fun(){
console.log(arguments.length);//保存实参,获取实参长度
console.log(arguments[1]);//获取第二个实参
}
fun("hello","hello");//传递实参,返回2
-
rest
rest是ES6引入新特性,获取除了已经定义的参数之外的所有的参数。
function f(a,b,…rest) {
console.log("a="+a);
console.log("b="+b);
console.log(rest);
}
f(1,2,3,4,5);
/*a = 1
b = 2
Array(3) [ 3, 4, 5 ]
*/
rest参数只能写在最后面,必须用…标识
变量的作用域、let、const
-
var定义变量有作用域
①在函数体中声明,则在函数体外不可使用
②在不同的函数体内部两个函数使用了相同的变量名不冲突
③内部函数可以访问外部函数的成员,反之则不行。
function f() {
var x=1;
function f3() {
var y=x+1;//2
}
var z=y+1;//Uncaught ReferenceError: y is not defined
}
④若内部函数变量和外部函数变量重名,不会互相影响
function f1() {
var a = 1;
function f2() {
var a = 'A'
console.log('inner'+a);//innerA
}
console.log('outer'+a);//outer1
}
JavaScript中函数查找变量从自身函数开始,由“内”向“外”查找,假设外部存在这个同名的函数变量,则内部函数会自动屏蔽外部函数的变量
- 提升变量的作用域
function f() {
var x="x"+y;
console.log(x);//xundefined
var y="y";
}
等同于:
function f() {
var y;//只声明,未赋值
var x="x"+y;
console.log(x);
y="y";
}
注意规范:所有的变量定义都放在头部
-
全局变量
JavaScript实际上只有一个全局作用域,任何变量(函数也可以视为变量),假设没有在函数作用范围内找到,就会向外查找,如果在全局作用域都没有找到,报错RefrenceError。 - 规范
//唯一全局变量
var mai={ }
//定义全局变量
mai.name= "Q";
mai.add=function(a,b) {
return a+b;
}
①把代码全部放入定义的唯一空间名字中,降低全局命名冲突问题。
②jQuery库把所定义的都放到jQuery中,用简化符$(selctor).action()
-
var,let,const
①var定义的变量,具有函数作用域,可以跨块访问(没有块的概念), 不能跨函数访问,存在变量提升现象,且可多次声明。(声明的变量是全局的)
②let定义的变量,只能在块作用域里访问,不能跨块访问,也不能跨函数访问,不存在变量提升现象,且只能声明一次。(声明的变量作用域只在循环体内,解决局部作用域冲突问题)
③const用来定义常量,使用时必须初始化(即必须赋值),只能在块作用域里访问,而且不能修改。
方法的定义和参数获取
this
①以函数形式调用,this永远都是window
②以方法形式调用,this就是调用方法的那个对象
var name = "qz";
function fun(){
console.log(this.name);
}
var obj1 = {
name:"xiaoq",
sayName:fun
}
var obj2 ={
name:"xiaoz",
sayName:fun
}
fun();//qz
obj1.sayName();//xiaoq
obj2.sayName();//xiaoz
apply
可用apply控制this的指向
fun.apply(obj1);//xiaoq