函数是一种语言必不可少的,函数也是很灵活的,面向过程语言,例如C,它的基本单位就是函数,但是面向对象的语言,基本单位是类,但是函数还是解决方法必不可少的,他是对一种问题的抽象,例如1+2+3…..+100,数学中使用∑,它代表了对这种逻辑的抽象表示,函数也使一样,是对相同功能的一个提炼,也是对一种功能的抽象。
和之前一样,也是从知识点入手,代码如下:
//定义一个函数,这里面是局部变量,如果直接调用,会提示ReferenceError,未定义
function foo(){
var x = 1;
x += 2;
}
console.log(x);
VM271:2 Uncaught ReferenceError: x is not defined(…)
//基本上相同的问题
function foo(){
var x = 1;
function inner(){
var y = x + 2;
}
}
console.log(y);
//变量的搜索顺序,从内到外,如果一直没有,提示undefined
function foo() {
var x = 1;
function bar() {
var x = 'A';
alert('x in bar() = ' + x); // 'A'
}
alert('x in foo() = ' + x); // 1
bar();
}
//定义在函数内的是局部变量
function foo(){
var x = 1;
alert(x);
}
//这里要特别注意的一点
//在JavaScript函数中,它会先扫描整个函数体的语句,把所有申明的变量“提升”到函数顶部:
function foo(){
var x = 'hello,'+y;
alert(x);
var y = 'bob';
}
foo();
//输出结果是 hello,undefined
//为什么呢?
上面代码和下面代码相同:
Javascript会先扫描整个函数体,将定义的变量全部提到上面,但是y在使用的时候还没有赋值,所以这时候y还是undefined
function foo(){
var y;
var x = 'hello,'+y;
alert(x);
y = 'bob';
}
//全局变量window
var course = "hello.cheng";
alert(course);//hello.cheng
//使用window
alert(window.course);//hello.cheng
//因为course是全局变量,所以使用其本身和window都是没有错的,只不过在正常情况下会将window省略
function foo(){
var course='hello';
alert(course);
alert(window.course);
}
foo();
//hello
//hello
这里会调用之前的全局变量
function fo(){
var cours='hello';
alert(cours);
alert(window.cours);
}
fo();
//hello
//undefined
//alert
window.alert('alert也是一个全局变量');//alert也是一个全局变量
var old_alert = window.alert;
old_alert('这也是正确的');//这也是正确的
old_alert = function(){}
old_alert('打印为空'); //undefined
old_alert = window.alert;
window.alert = function(){}(){}
window.alert('这样是不对的');//undefined
window.alert = old_alert;
window.alert('alert的功能又回来了');//alert的功能又回来了
名字空间,减少因为同名而带来的冲突
//定义一个全局变量
var MAPPER= {};
//设置name属性
MAPPER.name = 'myname';
//设置version属性
MAPPER.version = 1.0;
//设置其它函数
MAPPER.foo =function(){ console.log('foo函数');}
//调用函数
MAPPER.foo();//foo函数
//调用属性,都是全局变量
MAPPER.name;
"myname"
//作用域,这是因为var的作用域是整个函数,对于这种块级的不太合适
function foo(){
for(var i=0; i<100; i++){}
console.log(i);//101
}
//块级作用域
function foo(){
for(let i = 0; i<100; i++){}
console.log(i);//SyntaxError: Block-scoped declarations
}
//定义常量
//const也是和let一样的作用域是块级作用域
const PI = 3.14;
PI = 3;
3
console.log(PI);//3.14