<script>
// 变量作用域与解构赋值
function f1(y) {
var x = 1;
x = x + 2;
console.log(x+y);
console.log(x);
// 因为变量x在函数f1中申明,在这里属于局部变量,所以x只能在f1中访问,f1执行完,x就销毁了
}f1(2);//为了更直观一点,调用一下f1(),传个值
// x = x + 2; console.log("x在这里的值为:"+x);//运行这行时,控制台报错 x is not defined,说明无法访问函数里面的x
function f(y) {
var x = 1;
x = x + 1;
console.log(x+y);}f(2);
// 函数f和f1是两个不同的函数,所以x的值是独立的,f1()调用时,x的值为3,f()调用时,x的值为2
// 简述为两家人关起门来做同一件事情,但互相不影响
// 由于JavaScript的函数可以嵌套,此时,内部函数可以访问外部函数定义的变量,反过来则不行:
function foo() {
var x = 1;
function bar() {
var y = x + 1; // bar可以访问foo的变量x!
}
// var z = y + 1; // ReferenceError! foo不可以访问bar的变量y!
}
// 如果内部函数和外部函数的变量名重名怎么办
function foo1() {
var x = 1;
function bar1() {
var x = 'A';
console.log('x in bar() = ' + x); // 'A'
}// 城中城自己干自己的互不影响
console.log('x in foo() = ' + x); // 1
bar1();
}
foo1();
//变量提升
function foo2() {
var x = 'Hello, ' + y;//显示unfined
console.log(x);
var y = 'Bob';
}
foo2();
// 但语句var x = 'Hello, ' + y;并不报错,原因是变量y在稍后申明了。但是console.log显示Hello, undefined,
// 说明变量y的值为undefined。这正是因为JavaScript引擎自动提升了变量y的声明,但不会提升变量y的赋值。
// 相当于只闻其声不见其人
// 全局作用域
// 不在任何函数内定义的变量就具有全局作用域。实际上,JavaScript默认有一个全局对象window,全局作用域的变量实际上被绑定到window的一个属性:
// var course = 'hello world';
// alert(course); // hello world
// alert(window.course); // hello world
// // 由于函数定义有两种方式,以变量方式var foo = function () {}定义的函数实际上也是一个全局变量,因此,顶层函数的定义也被视为一个全局变量,并绑定到window对象:
// function foo5() {
// alert('foo5');
// }
// foo5(); // 直接调用foo()
// window.foo5(); // 通过window.foo()调用
// 名字空间
// 全局变量会绑定到window上,不同的JavaScript文件如果使用了相同的全局变量,或者定义了相同名字的顶层函数,都会造成命名冲突,并且很难被发现。
// 减少冲突的一个方法是把自己的所有变量和函数全部绑定到一个全局变量中。例如:
// 唯一的全局变量MYAPP1:
// var MYAPP1 = {};
// // 其他变量:
// MYAPP1.name = 'my';
// MYAPP1.version = 4.0;
// // 其他函数:
// MYAPP1.foo6 = function () {
// return 'foo6';
// };
// // 把自己的代码全部放入唯一的名字空间MYAPP1中,会大大减少全局变量冲突的可能。
// 许多著名的JavaScript库都是这么干的:jQuery,YUI,underscore等等。
// 为了解决块级作用域,ES6引入了新的关键字let,用let替代var可以申明一个块级作用域的变量:
// 局部作用域
// 由于JavaScript的变量作用域实际上是函数内部,我们在for循环等语句块中是无法定义具有局部作用域的变量的:
// function foo7() {
// for (var i=0; i<100; i++) {
// //
// }
// i += 100; // 仍然可以引用变量i
// }foo7();
// 为了解决块级作用域,ES6引入了新的关键字let,用let替代var可以申明一个块级作用域的变量:
// function foo8() {
// var sum = 0;
// for (let i=0; i<100; i++) {
// sum += i;
// }
// i += 1;
// console.log(i);// i is not defined,访问不到for循环里面的变量i了,i属于for循环的块级作用域
// }
// foo8();
// 常量
// const PI=3.14
// 解构赋值
// 现在,在ES6中,可以使用解构赋值,直接对多个变量同时赋值:
// 如果浏览器支持解构赋值就不会报错:
// var [x, y, z] = ['hello', 'JavaScript', 'ES6'];
// console.log('x = ' + x + ', y = ' + y + ', z = ' + z);//x = hello, y = JavaScript, z = ES6
// //忽略某些元素
// let [, , w] = ['hello', 'JavaScript', 'ES6']; // 忽略前两个元素,只对z赋值第三个元素
// w; // 'ES6'
// //对对象进行解构赋值
// var person = {
// name: '小时',
// age: 88,
// gender: 'man',
// passport: '111111',
// };
// var {name, age, passport} = person;
// console.log('name = ' + name + ', age = ' + age + ', passport = ' + passport);//name = 小时, age = 88, passport = 111111
// 快速获取当前页面的域名和路径:
// var {hostname:domain, pathname:path} = location;
// console.log('domain = ' + domain + ', path = ' + path);//domain = www.baidu.com, path = /
</script>
标签:function,console,函数,作用域,javascript,学习,log,var,变量 From: https://blog.csdn.net/m0_74762754/article/details/139549809