我仍然找到 with 关键字有点...神秘的.

简要地, with 行为如下:

with (obj) {
    // do stuff
}

这增加了 obj 到作用域链的头部,然后执行 with 块。当块完成后,它会删除 obj 从作用域链的头部开始。

根据 多维数据中心, ,这允许你做类似的事情

var a, x;
var r = 10;
with(Math) {
    a = PI * r * r;
    x = r * cos(PI / 2);
}

所以我可以参考属性 Math - 喜欢 PI ——直接,不言而喻 Math.PI. 。这很好,但有点没用。

任何人都可以提供一个有趣的用法示例 with?

有帮助吗?

解决方案

使用内部的for循环功能标准闭合溶液的替代:

<a  href="#">blah</a><br>
<a  href="#">blah</a><br>
<a  href="#">foo</a><br>
<script>
    (function() {
    var anchors = document.getElementsByTagName('a');
        for ( var i = anchors.length; i--; ) {
            var link = anchors[i];
            with ({ number: i }) {
                link.onclick = function() {
                    alert(number);
                };
            }
        }
    })();
</script>

信用到nlogax用于提供我非常扯下一个解决方案: 的Javascript臭名昭著的循环问题?

这里的标准溶液:

<script>
    (function() {
    var anchors = document.getElementsByTagName('a');
    for ( var i = anchors.length; i--; ) {
        var link = anchors[i];
        (function(i) {
            link.onclick = function() {
                alert(i)
            }
        })(i);
    }
    })();
</script>

其他提示

约翰Resig的JavaScript的microtemplating 显示了一些有趣的应用。

我经常用它来多个CSS属性添加到一个style对象,例如

with(document.body.style) {
    color = 'green';
    background = 'red';
}

另外,我用它至少一旦的分配对象到局部变量的性质,而不必存储对对象本身的引用。

这也是封闭件的替代,当你想采取一个变量的值的“快照”:

var foo = [];
for(var i = 10; i--;)
    with({ i : i }) foo[i] = function() { document.writeln(i); };

// prints 0..9
for(var i = 0; i < foo.length; ++i)
    foo[i]();

请注意,with会严重影响性能如您添加到词法环境中的对象的原型链解决任何变量名时必须首先检查。

with语句在JS是像在声明说VB.net。 这只不过是为了避免与对象的属性/方法的重复的方法。

例如,假定基于事件/动作的标签控制正被修改。那 标签控制具有诸如FONTCOLOR,的CssClass,可见性等方面的性能。

代替程序员的写作:

myLabel.FontColor=Color.Blue
myLabel.CSSClass="SomeCSSClass"
myLabel.Visiblity=True
myLabel.Text = "Hello World"

我们可以缩短,为:

With myLabel
  .Text = "Hello World"
  .FontColor = Color.Blue
  .CssClass="SomeCSSClass"
  .Visibility=True
End With

我对 Javascript 没有经验,刚刚开始了解应该如何使用它,所以我的意见不应与具有特定语言经验的人的意见同等重要。我对我的想法的回应感兴趣。

我一直在尝试一种依赖于 Javascript 的类对象定义风格 陈述。我认为这是合法的使用。

这种风格中的每个类类对象都充当对象的工厂,以满足某些目的。

这种风格没有使用 实例方法中的关键字。

这种风格认为从这些类对象之一生成的每个对象都具有公共方面和私有方面。Javascript 对象代表了这些方面中的每一个。对象引用的持有者实际上仅指公共方面。然而,这些方法知道这两个方面,我用闭包来实现它。

我并不假装这种风格适用于我们非常关心运行时间或内存性能的情况。为了提高编程效率,我故意牺牲了其中的相当一部分。我希望找到很多情况,在这些情况下,我想要快速编程并且几乎不会出错,并且运行时的需求并不重要。

由于我一直在浏览器而不是 Node.js 中尝试代码,因此对我来说,开发环境的一个实际考虑因素是大型源文件中的语法错误可能很难确定和纠正。我通过少量添加代码来解决这个问题。因此,我希望类类对象能够一次接受一个实例方法定义,而不是要求所有方法定义都出现在一个源文件中。

我最初声明一个类类对象,但没有在其中定义任何实例方法,然后将类类对象放置在我正在编程的任何命名空间中。

然后,我在名为“init”的方法中重复调用类类对象,每次都会传递一个 初始化器, ,在实例初始化期间调用的函数。

最终,当我开始使用类类对象作为其实例的工厂时,每当我要求它提供一个新实例时,它都会为该实例创建公共和私有方面,将私有方面链接到公共方面,然后调用所有已定义的初始值设定项,将新实例的私有方面传递给它们。

按照我的风格,每个公共属性都是一个方法。所有其值不是函数的变量都应该位于私有端。

初始化程序可以做的一件事是在私有端建立一个变量。

初始化器可以做的另一件事是在公共或私有端添加一个方法。

执行初始化程序的顺序很重要——类类对象需要按照它们定义的顺序执行它们。因此,每个初始化程序都可以依赖具有由早期初始化程序建立的属性的实例的公共和私有方面。对于程序员来说,这实际上创建了一对词法作用域,因为初始化器不是由任何类型的条件或动态代码建立的;它们是在浏览器读取并解析源​​文件后立即执行源文件时建立的。

现在,在某些语言中,特别是 Ruby 语言和 Self 语言,您可以编写裸标识符并将其解释为对当前对象的方法调用。因此,在 Ruby 中,“foo”可以表示“self.foo”,而在 Self 中,“foo”可以表示“self foo”(这些语言之间方法调用的语法有所不同,但取决于我所说的详细程度)现在的语义,Ruby 中的“self.foo”和 Self 中的“self foo”是相同的)。由于存在“self”,这种缩写对于调用私有方法和实例变量特别方便。Javascript 语言不提供这种便利。

在一个实例方法中的上下文中,我想使用私有或公共侧的属性以达到其值(请注意,不在作业的左侧),我喜欢仅通过其名称引用属性的便利性而不必写“ vars”。或“自我”。在它的左侧找到它(我将“ vars”用于私人方面,而“自我”用于公共方面)。出于这个原因,我将每个初始值设定项包装在 Javascript 中 陈述。这对我来说似乎是合理的,因为按照我的风格,目标对象的数量是根据词汇确定的。要查看属性,程序员只需查看源文件中先前为同一类类对象提供的初始值设定项(该对象本身由源代码中的名称标识,因此出于软件工程的目的,我们可以将其视为一个词汇实体,尽管没有任何 Javascript 解析器检测到这一点)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top