首先看一个例子:
function foo() {
getname = function () { alert (1); };
return this;
}
foo中的getname理解为变量,它没有var声明, 所以先向当前foo函数作用域内寻找getname变量,没有。
再向当前函数作用域上层,即外层作用域内寻找是否含有getname变量。
是一个从里到外寻找变量的过程, 会一直向上查找到window对象,若window对象中也没有getname属性,就在window对象中var一个getname变量(全局变量)。
先贴上几个例子的代码截图,方便从基础理解之
javascript的函数定义有个特点,它会先扫描整个函数体的语句,把所有申明的变量“提升”到函数顶部。
‘use strict’;
function foo() {
var x = ‘hello, ’ + y;
alert(x);
var y = ‘bob’;
}
foo();
对于上述foo()函数,javascript引擎看到的代码相当于:
function foo() {
var y; // 提升变量y的申明
var x = ‘hello, ’ + y;
alert(x);
y = ‘bob’;
}
把var y = ‘bob’;拆分为了 var y ;y=‘bob’;所以y的值为undefined
所以为了避免各种怪异事件的发生,最好在函数开头声明需要的变量;
function foo() {
var
x = 1, // x初始化为1
y = x + 1, // y初始化为2
z, i; // z和i为undefined
// 其他语句:
for (i=0; i《100; i++) {
。。.
}
}
javascript默认有一个全局对象window
直接访问全局变量a和访问window.a是完全一样的
‘use strict’;
function foo() {
for (var i=0; i《100; i++) {
//
}
i += 100; // 仍然可以引用变量i
}
为了解决块级作用域,es6引入了新的关键字let,用let替代var可以申明一个块级作用域的变量
‘use strict’;
function foo() {
for (var i=0; i《100; i++) {
//
}
i += 100; // 仍然可以引用变量i
}
麒麟970处理器有多强?华为想要引领优势全靠它
善睐物联:路由器要不要关?需要怎么摆放?
华为Mate50“没电也能打电话” 1%电量下可待机3小时
如何通过分流器来对直流电源电流进行测试
汽车系统ASIC、ASSP和EMC设计
js中变量作用域问题
A17 Bionic和M3芯片良品率仅为55%,晶圆价格或有变化
光敏电阻器的型号命名方法
我国IPv6应用已进入高速发展期IPv6地址数量已居世界第二
小米的五次调整,雷军的三个焦虑
PI反激式开关IC,带来更出色的电动汽车体验
数据转换器功能有助于解决无线基础设施的成本和尺寸设计挑战
基于物联网时代兴起随之而生八大产业解析
智能包裹The Box 内有电子墨水标签传感器摄像头扬声器和麦克风
OPPOR11最新消息:20w快充+安卓7.1,较OPPOR9升级的可不止一点
国内负极材料出货量TOP10 你想了解的都在这里
OPPO Reno4 Z 5G曝光,预计为A92s更名版
压电控制器与压电偏转镜的连接操作方法
蓝牙模块的5大应用场景
浪涌保护器怎么选_多少钱