js中window对象前缀是不是都可以省略?
比如window.history.length 直接写history.length好像也可以 还有open 是不是所有的window对象(如screen、location)及其方法、属性都可以省略window前缀?还是说有什么限制?
js中window对象前缀是不是都可以省略?
比如window.history.length 直接写history.length好像也可以 还有open 是不是所有的window对象(如screen、location)及其方法、属性都可以省略window前缀?还是说有什么限制?
说下我的理解吧,可能不精准,仅供参考。
Window 对象表示浏览器中打开的窗口,那么满足两个条件,就可以省略:
那么在以上两个条件的前提下,以下情况是无法省略window的:
frame
新创建一个子window
对象泻药。
作用域问题, 下面来自《你不懂js》的作用域章节
function foo(a) {
console.log( a + b );
}
var b = 2;
foo( 2 ); // 4
引擎:“嘿,foo 的 作用域,听说过 b 吗?我得到一个它的 RHS 引用。”作用域:“没有,从没听说过。问问别人吧。”
引擎:“嘿,foo 外面的 作用域,哦,你是全局 作用域,好吧,酷。听说过 b 吗?我得到一个它的 RHS 引用。”
作用域:“是的,当然有。给你。”
可以大概得出,在函数foo
的作用域中并没有b
变量,所以会去外层(直到全局, 未找到则会报错)寻找,而在浏览器中也就是会去window
下寻找。如果使用window.alert
,则表示alert
存在于window
作用域下, 这样Js引擎直接就去window
下获取.
以上都是个人理解,可能会有偏差,还请指出
这个就是个scope的问题,你如果在当前作用域中自己定义了history变量,那你用想要用全局的,就要加window. ;
如果没有覆盖,引擎查找的时候会一层一层往外找,直到找到为止;这些就是浏览器中内置的一些变量;
可以想象成这样
let a = 10;
function f(){
let b = 20;
function g(){
console.log(a,b); //跟在此处访问a、b是一样的道理
}
}
13 回答13k 阅读
7 回答2.2k 阅读
3 回答1.3k 阅读✓ 已解决
6 回答1.3k 阅读✓ 已解决
2 回答1.4k 阅读✓ 已解决
3 回答1.3k 阅读✓ 已解决
6 回答1.1k 阅读
不是所有的都能忽略
在真的项目里,在不同的作用域下,你不写
window
谁知道会发生什么。(但同样不是所有的都不能忽略,比如document/alert
)