Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/363.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/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方法声明_Javascript - Fatal编程技术网

Javascript方法声明

Javascript方法声明,javascript,Javascript,这样声明一个方法正确吗 window['TEST']['myfunction?'] = function(param) { for(var a in([ param.getElementsByTagName('ol'), param.getElementsByTagName('ul') ]){ found += a.length(); } return a != 0 ? true : false; } 我总

这样声明一个方法正确吗

window['TEST']['myfunction?'] = function(param) {
        for(var a in([ param.getElementsByTagName('ol'), param.getElementsByTagName('ul') ]){
found += a.length();
}
        return a != 0
            ? true
            : false;
    }
我总是这样声明方法

var TEST = function(param){
...
}

但是我在一些代码中看到了第一个声明。但我没办法做到。这两种声明的区别是什么。哪一个更有效?

窗口['TEST']['myfunction?']=
获取全局对象,获取存储在其
TEST
属性中的对象,然后将函数分配给其
myfunction?
属性

通常最好避免使用带有奇数字符的全局名称和属性名称(如


var TEST=
声明一个局部作用域变量(
TEST
),并为其赋值。因为它不是对象的属性,所以它不是方法。

括号表示法和点表示法可以互换。据我所知,它们的执行速度大致相同。括号表示法允许您使用点表示法中非法的字符

// eg 
var myObject = {}
myObject["var1"] = 1; // bracket notation same as dot notation
myObject.var1 = 1;    // dot notation same as bracket notation

myObject["test-me"] = 2; // valid creation of property test-me
myObject.test-me = 2; // will throw an error as "-" is an operator.
// the invalid character will force you to use bracket notion whenever you access the property.

其他人可以回答第二部分。

在Javascript中,几乎所有东西都是一个对象,这意味着所有东西都有一组特定的属性。您可以通过几种方式访问或设置这些属性,其中两种方式与此相关

第一个选项是
window.foo='bar'。另一种编写方法是
window['foo']='bar'window.invalid-foo='bar'
将不起作用<另一方面,代码>窗口['invalid-foo']


现在来回答你的问题;当遇到
window['TEST']['myFunction?']
时,代码的原始作者可能有自己的框架来检查全局
window.TEST
对象的函数。迭代这些函数并调用它们作为测试代码的方法

我不建议这样做,因为:

  • 使用非标准的方法声明变量会造成不必要的混乱
  • 一种声明函数的方法比另一种更快吗?后者的速度要快一点,我们说的是每秒200万次,而不是每秒15亿次


    第一次声明不正确。1.全球2。使用函数名中的
    ,这里有两个完全无关的问题。请挑一个问一下。我实际上不知道第一次宣布的语法。我只是把它放在某个地方。我想知道第一个宣告语法。有什么联系吗?@Quentin我已经改变了。那么现在我可以知道这个问题了吗?我只是不知道为什么这个问题被标记为否定?这是一个简单的语法问题,那么问题出在哪里呢。投票反对的人也必须对此进行评论好的,所以如果我想用参数调用声明为第一种类型(全局)的方法,那么语法应该是什么
    Test.myfunction?(param)
    窗口['Test']['myfunction?'](param)
    var-Test
    放置在函数外部的将是全局范围。变量范围取决于您声明变量的位置。在函数内部,它的作用域是函数,在外部,它是全局的。不包括
    var
    标记,它始终是全局的<代码>测试=0始终是全局的。在严格模式下不允许
    “使用严格”
    谢谢,用window[]声明它怎么样,我想这会使它成为全局的?window是大多数浏览器环境的默认全局范围。很好的解释。但是如果我给出了问题中的名称,那么如何调用这个方法呢?如果我尝试
    TEST.myFunction?(param)
    ,那么会出现错误?是的,因为在使用点表示法时不能使用特殊字符。例如,解释器不可能正确解释
    var a=test?1:2和变量a=测试?()?1 : 2;。这对我很有帮助。谢谢