一、声明(两种方式)
第一种:function () { … }是一个匿名函数,它没有函数名。但是,这个匿名函数赋值给了变量a,所以,通过变量a就可以调用该函数。
第二种:JavaScrpit中,函数也是一个对象,函数名f可以视为指向该函数的变量。
"use strict" //严格模式
var a = function () { //第一种
console.log('a');
}
function f() { //第二种
console.log('f');
}
a();
f();
结果会在控制台记录a和f两条日志
二、参数的多少和arguments
传入的参数多少和函数参数个数可以完全不一样.可多也可少,只需要按照顺序输入即可.
function f(x,y,z) {
let s = '';
for (let i = 0; i < arguments.length; i++) {
s += arguments[i];
}
console.log("传入了"+arguments.length+"个参数:"+s)
}
f(1,2,3,4)
f(1,2,3);
f(1,2,);
f();
三、参数之rest
rest意思是剩余的,在声明函数的时候可以这样写
这样底层就会把多余的参数存在了rest中.
注意:就算没有多余的参数,rest是空不是undefined的
function f(a,b,…rest)
function f(a,b,...rest) {
console.log("a:"+a+" b:"+b+" rest:"+rest);
}
f(1,2,3,4,);
f(1,2);
四、变量作用域
1) 变量提升
内部声明的变量会提前提到函数内部,在加载一个函数时,先加载这个函数里面所有声明的变量.所以写的时候最好在函数内部先声明所有的变量.这样就不会出错.
例子:
function a() {
var x = 'Hello '+y;
console.log(x);
var y = 'world';
}
a();
在这里输出的结果是 Hello undefined
原因就是在加载的时候加载出来是这个样子
function a() {
var x = 'Hello '+y;
var y; //这个时候是undefined
console.log(x);
var y = 'world';
}
所以它不会报错,当执行到console.log的时候还没有执行y = ‘world’;
所以输出出来时hello undefined.
2)全局作用域
不在任何函数内定义的变量就具有全局作用域,实际上,JavaScript默认有一个全局对象window.全局作用域的变量实际上被绑定到window的属性上.
比如:var a = ‘hello’ 调用alter(a)和alter(window.a)是一样的
再比如function f(x){} 调用f(x)和window.f(x)是一样的
还有alter()就是window.alter();
这说明JavaScript 只有一个全局作用域,每当函数内部调用变量时候,没有在当前作用域找到,就会向上查找,最终找到全局作用域,再没有找到就抛出ReferenceError错误
3)名字空间
全局变量会绑定到window对象上,如果有多个不同的JavaScript文件都使用了相同的全局变量,或者使用了相同名字的顶层函数,都会造成命名冲突,所以有了这么一项机制:名字空间
var MYWINDOWS = {};
MYWINDOWS.name = 'XXX'
MYWINDOWS.data = 1;
MYWINDOWS.f = function (x) {
return 'f';
}
这样将MYWINDOWS当作唯一的一个全局变量,就不会与其他文件的全局变量混淆了.
在jQuery,YUI,underscore等等库中都使用过这项机制
四、解构赋值
1.可以用来多项赋值,将一个数组的元素分配给多个变量
var [x,y,z] = ['hello ','world ','!'];
console.log(x+y+z)
2.有嵌套的也可以
let [x,[y,z]] = ['hello ',['world ','!']];
console.log(x+y+z);
还可以忽略掉某些元素
let [,[y,z]] = ['hello ',['world ','!']];
console.log(y+z);
3.用于从一个对象中取出某些属性
如果变量不存在时候,就是undefined,
需要注意这时候用的是{},
如果{}里面的变量已经在全局变量声明过了,就要使用([x,y] = {1,2})这样写.因为JavaScript引擎把"{"开头的语句当成了块处理.
var person = {
name : '小明',
age : 20,
address : {
city : '北京',
street : 'No.1'
}
}
//这里name = 'x',可以给它赋默认值
var {name,address : {city}} = person;
console.log(name+" "+city)
用处:
交换两个变量x和y的值,可以这么写,不再需要临时变量:
var x=1, y=2;
[x, y] = [y, x]
快速获取当前页面的域名和路径:
var {hostname:domain, pathname:path} = location;
可以用来快速创建一个对象.前提是这个函数接收对象作为参数.
function buildDate({year, month, day, hour=0, minute=0, second=0}) {
return new Date(year + ‘-’ + month + ‘-’ + day + ’ ’ + hour + ‘:’ + minute + ‘:’ + second);
}