侧边栏壁纸
博主头像
落叶人生博主等级

走进秋风,寻找秋天的落叶

  • 累计撰写 130562 篇文章
  • 累计创建 28 个标签
  • 累计收到 9 条评论
标签搜索

目 录CONTENT

文章目录

函数作用域(一)

2024-05-13 星期一 / 0 评论 / 0 点赞 / 96 阅读 / 4833 字

console.log(a) //ReferenceError: a is not defined console.log(a); var a=1; //undefined js中 console.l

console.log(a) //ReferenceError: a is not defined

console.log(a); var a=1;   //undefined

js中 console.log(a) ;var a=1; 这样会显示undefine而不是没有定义,因为js可以把定义提前,但是不能把赋值提前。类似于函数(哪怕在js文件后部分定义,也可以在文件前部分使用)。

//补充:

Js不是可以把定义提前,而是自动已经把定义提前!因为js的函数作用域属性,整个函数都是他的。看下例:

var scope="global";  

function t(){  

    console.log(scope);  //undefined

    var scope="local"  

    console.log(scope);  //local

}  

t();

这段代码等同于:

var scope="global";  

function t(){  

    var scope;   //被自动提前

    console.log(scope); //不再是外部的全局变量,被内部定义的scope洗了一遍

    scope="local"  

    console.log(scope);  

}  

t();

 

同时又有一个有趣的问题

var scope="local";

function aa(){

    Console.log(scope); //local

}

这是为什么呢?因为函数里没有定义var scope 啊,scope没有被洗掉;全局变量嘛

 

这又是啥

var scope="local";

function aa(scope){

    Console.log(scope);

}

aa(scope) //local

aa(tt); //tt这没啥说的,你是形参,传啥是啥,你跟全局变量重名了不起啊

 

 

那么问题又来了,这又输出啥

var scope="local";

function aa(scope){

console.log(scope); //local,等同于在函数内强制第一行var scope=外面的“local”

var scope=aaa;

console.log(scope); //aaa

}

aa(scope);

console.log(scope); //local变量参数传值会在函数里new一个,没你啥事

 

var scope="local";

function aa(scope){

console.log(scope); //local,等同于在函数内强制第一行var scope=外面的“local”

scope=aaa; //虽然你没加var,你想改变全局变量,但是在你

//函数作用域中已经在第一步等同于var scope了

//所以你伤不着全局变量了

console.log(scope); //aaa

}

aa(scope);

console.log(scope); //local变量参数传值会在函数里new一个,没你啥事

 

 

var scope="local";

function aa(){

console.log(scope); //local我的理解是,这里第一行没有暴力添加var scope

scope=aaa; //因为这里没有函数作用域,所以这个是洗了全局变量;

console.log(scope); //aaa

}

console.log(scope); //aaa 全局变量在里面成功被洗。

 

总体来说几个心法:

1、函数作用域(函数领域强制头行定义)。

2、变量当形参会在函数里被new一个,不影响外部。

3、函数无形参,全局变量进去不var,直接暴力改值,是改本身。

广告 广告

评论区