js中window对象前缀是不是都可以省略?

js中window对象前缀是不是都可以省略?
比如window.history.length 直接写history.length好像也可以 还有open 是不是所有的window对象(如screen、location)及其方法、属性都可以省略window前缀?还是说有什么限制?

阅读 8.3k
5 个回答
function getWindowName1(){
    ...
    var name = 'tom'
    ...
    console.log('name',name)//虽然从函数命名希望访问window.name,但可能某段代码让你访问到函数作用域内的name,常见的是window.clear()
}
function getWindowName2 (){
    console.log('window.name',name)
}
getWindowName1();
getWindowName2();

不是所有的都能忽略
在真的项目里,在不同的作用域下,你不写window谁知道会发生什么。(但同样不是所有的都不能忽略,比如document/alert)

clipboard.png

所以都可以省略这个window

凡是 window对象的属性和方法都可以

window.alert()
window.history

说下我的理解吧,可能不精准,仅供参考。
Window 对象表示浏览器中打开的窗口,那么满足两个条件,就可以省略:

  1. 在浏览器环境下
  2. 在顶级Frame下

那么在以上两个条件的前提下,以下情况是无法省略window的:

  1. 在子Frame框架下,因为浏览器会为frame新创建一个子window对象
  2. 非浏览器环境下,比如Node

泻药。

作用域问题, 下面来自《你不懂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是一样的道理
    }
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题