设置Javascript变量时,var win=window.dialogArguments | | | | opener | parent | | top;做
我在一个Javascript文件中遇到了这种结构,我不确定它是做什么的设置Javascript变量时,var win=window.dialogArguments | | | | opener | parent | | top;做,javascript,variables,Javascript,Variables,我在一个Javascript文件中遇到了这种结构,我不确定它是做什么的 var win = window.dialogArguments || opener || parent || top; 我知道window.dialogArguments从父窗口返回可选参数,但我不知道|操作符正在做什么 这是否设置了某种层次结构,如果.dialogArguments返回NULL,它将分配window.opener的值(依此类推)。但其求值不会返回布尔值(true)/false),但第一个操作数的值与
var win = window.dialogArguments || opener || parent || top;
我知道window.dialogArguments
从父窗口返回可选参数,但我不知道|
操作符正在做什么
这是否设置了某种层次结构,如果.dialogArguments
返回NULL,它将分配window.opener
的值(依此类推)。但其求值不会返回布尔值(true)/false),但第一个操作数的值与true
时相同(即布尔值(op)==true
),否则为第二个操作数的值
因此表达式window.dialogArguments | opener | parent | top
,相当于window.dialogArguments | |(opener | | parent | top))
,将产生:
的值,如果其转换为布尔值等于window.dialogArguments
,或true
- 如果转换为布尔值的值等于
,则true
的值,或opener
- 如果转换为布尔值的值等于
,则true
的值,或parent
否则top的值
var win;
if (window.dialogArguments) {
win = window.dialogArguments;
} else if (opener) {
win = opener;
} else if (parent) {
win = parent;
} else {
win = top;
}
请注意,如果变量不存在,则可能会出现ReferenceError。如果您处于全局范围(window
),最好使用window.foo
,而不仅仅是foo
,以避免此类引用错误美国
顺便说一句:其他语言也有类似的操作和函数,它们的作用几乎相同,例如SQL的coalesce
函数返回第一个非空值。但其求值不会返回布尔值(true)/false),但第一个操作数的值与true
时相同(即布尔值(op)==true
),否则为第二个操作数的值
因此表达式window.dialogArguments | opener | parent | top
,相当于window.dialogArguments | |(opener | | parent | top))
,将产生:
的值,如果其转换为布尔值等于window.dialogArguments
,或true
- 如果转换为布尔值的值等于
,则true
的值,或opener
- 如果转换为布尔值的值等于
,则true
的值,或parent
否则top的值
var win;
if (window.dialogArguments) {
win = window.dialogArguments;
} else if (opener) {
win = opener;
} else if (parent) {
win = parent;
} else {
win = top;
}
请注意,如果变量不存在,则可能会出现ReferenceError。如果您处于全局范围(window
),最好使用window.foo
,而不仅仅是foo
,以避免此类引用错误美国
顺便说一句:其他语言也有类似的操作和函数,它们的作用几乎相同,例如SQL的
coalesce
函数返回第一个非空值。这是一个查找父窗口或框架的聪明方法。它将返回链中第一个没有falsy值的对象(即null
/未定义的/false
)
把它读成(议论文1或议论文2或议论文3.)
这是它检查的内容:
窗口。如果打开模式对话框,则对话框参数将存在
window.opener
将存在,如果它是由窗口打开的弹出窗口。open
或(我认为)atarget=\u blank
- 如果当前页面是frame或iframe,则将存在父级
top
是帧集中最顶层的帧,但我看不出如何达到此条件,因为父帧应始终存在。如果parent
位于不同的域中,可能会出现跨域问题-我不确定
这是一种查找父窗口或框架的聪明方法。它将返回链中第一个没有falsy值的对象(即null
/未定义的/false
)
把它读成(议论文1或议论文2或议论文3.)
这是它检查的内容:
窗口。如果打开模式对话框,则对话框参数将存在
window.opener
将存在,如果它是由窗口打开的弹出窗口。open
或(我认为)atarget=\u blank
- 如果当前页面是frame或iframe,则将存在父级
top
是帧集中最顶层的帧,但我看不出如何达到此条件,因为父帧应始终存在。如果parent
位于不同的域中,可能会出现跨域问题-我不确定
将win
分配给:
窗口。dialogArguments
如果首先可用
开启器
如果之前的条件未满足
parent
如果之前的条件未满足
top
如果之前的条件未满足
因此,win
将首先从左到右分配给任何可用的对象。win
将分配给:
窗口。dialogArguments
如果首先可用
开启器
如果之前的条件未满足
parent
如果之前的条件未满足
top
如果之前的条件未满足
因此,win
将首先从左到右分配给任何可用的对象。是的
它返回第一个定义的(非空)ob