1、这个v2和v3,都是a里面定义的局部变量:
function a(){
var v2, v3
2、v2=80,是调用b函数时,b函数直接对b外部的v2进行了赋值,最近的是a函数的v2,所以最终alert的v2是80
3、b函数虽然对v3赋值为80,但是v3是参数里的v3,并不是a函数的v3,对参数v3进行赋值,不会改变a函数的v3,所以alert的v3不变,还是40
另外,楼上的回答虽然有一定道理,但是只是针对同一个人写同一个项目而言,
实际的工作开发中,引用多个其它人开发的js,甚至其它公司开发的js都是常事,所以出现上面的类似代码也是可能的,另外,这个例子对于理解js的变量作用域还是有一定意义的
let和var关键字的异同
1、声明后未赋值,表现相同
'use strict'(function() {
var varTest
let letTest
console.log(varTest) //输出undefined
console.log(letTest) //输出undefined}())
2、使用未声明的变量,表现不同
(function() {console.log(varTest) //输出undefined(注意要注释掉下面一行才能运行)
console.log(letTest) //直接报错:ReferenceError: letTest is not defined
var varTest = 'test var OK.'
let letTest = 'test let OK.'}())
3、重复声明同一个变量时,表现不同
'use strict'(function() {
var varTest = 'test var OK.'
let letTest = 'test let OK.'
var varTest = 'varTest changed.'
let letTest = 'letTest changed.' //直接报错:SyntaxError: Identifier 'letTest' has already been declared
console.log(varTest) //输出varTest changed.(注意要注释掉上面letTest变量的重复声明才能运行)
console.log(letTest)
}())
4、变量作用范围,表现不同
'use strict'(function() {
var varTest = 'test var OK.'
let letTest = 'test let OK.'
{
var varTest = 'varTest changed.'
let letTest = 'letTest changed.'
}
console.log(varTest) //输出"varTest changed.",内部"{}"中声明的varTest变量覆盖外部的letTest声明
console.log(letTest) //输出"test let OK.",内部"{}"中声明的letTest和外部的letTest不是同一个变量}())