Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
设置Javascript变量时,var win=window.dialogArguments | | | | opener | parent | | top;做_Javascript_Variables - Fatal编程技术网

设置Javascript变量时,var win=window.dialogArguments | | | | opener | parent | | top;做

设置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),但第一个操作数的值与

我在一个Javascript文件中遇到了这种结构,我不确定它是做什么的

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
    或(我认为)a
    target=\u blank

  • 如果当前页面是frame或iframe,则将存在父级

  • top
    是帧集中最顶层的帧,但我看不出如何达到此条件,因为父帧应始终存在。如果
    parent
    位于不同的域中,可能会出现跨域问题-我不确定


  • 这是一种查找父窗口或框架的聪明方法。它将返回链中第一个没有falsy值的对象(即
    null
    /
    未定义的
    /
    false

    把它读成(议论文1议论文2议论文3.)

    这是它检查的内容:

    • 窗口。如果打开模式对话框,则对话框参数将存在

    • window.opener
      将存在,如果它是由
      窗口打开的弹出窗口。open
      或(我认为)a
      target=\u blank

    • 如果当前页面是frame或iframe,则将存在父级

  • top
    是帧集中最顶层的帧,但我看不出如何达到此条件,因为父帧应始终存在。如果
    parent
    位于不同的域中,可能会出现跨域问题-我不确定


  • win
    分配给:

    • 窗口。dialogArguments
      如果首先可用
    • 开启器
      如果之前的条件未满足
    • parent
      如果之前的条件未满足
    • top
      如果之前的条件未满足

    因此,
    win
    将首先从左到右分配给任何可用的对象。

    win
    将分配给:

    • 窗口。dialogArguments
      如果首先可用
    • 开启器
      如果之前的条件未满足
    • parent
      如果之前的条件未满足
    • top
      如果之前的条件未满足
    因此,
    win
    将首先从左到右分配给任何可用的对象。

    是的

    它返回第一个定义的(非空)ob