JavaScript学习之路06_函数

函数是一种语言必不可少的,函数也是很灵活的,面向过程语言,例如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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值