Javascript 在VS2010中,当位于命名空间内时,将intellisense剔除

Javascript 在VS2010中,当位于命名空间内时,将intellisense剔除,javascript,visual-studio-2010,namespaces,knockout.js,intellisense,Javascript,Visual Studio 2010,Namespaces,Knockout.js,Intellisense,我有一个javascript文件,其中包含我的knockout viewModel。我已添加了对淘汰调试文件的引用,但intellisense仅在我位于命名空间花括号之外时才起作用: /// <reference path="knockout-2.0.0.debug.js" /> // YES! I get intellisense here :-) (function (window, $, ko, undefined) { // ... lots of js // NO in

我有一个javascript文件,其中包含我的knockout viewModel。我已添加了对淘汰调试文件的引用,但intellisense仅在我位于命名空间花括号之外时才起作用:

/// <reference path="knockout-2.0.0.debug.js" />

// YES! I get intellisense here :-)

(function (window, $, ko, undefined) {
// ... lots of js
// NO intellisense in here :-(

})(window, jQuery, ko); 

(可能我在名称空间中遗漏了什么?我是否需要将
ko
传递到我的名称空间?

Intellisense不够聪明,无法遵循引用。可以说,您不需要像这样向“名称空间”中注入引用。我认为它甚至不是一个名称空间,它只是一个闭包。考虑到正常用例,名称空间是一组相关代码的全局容器。一个应用程序可能在全局范围内有一个引用,这将被视为应用程序的命名空间。其他库(如jQuery)将在全局范围内注册它们自己的值,这可能被认为是一个名称空间。在其他情况下,您可以将整个作用域包装在一个闭包中,在闭包中注册名称空间,因此您永远不需要接触全局作用域

我明白了为什么您可能想要将引用注入到函数中。这种类型遵循一种接口模式,因此您可以使用模拟版本替换这些变量。不幸的是,我认为您无法推断对Intellisense的引用,并且出于同样的原因(即,您可以将其与任何内容交换),它无法准确地说出这些对象包含的内容

在静态类型的世界中,我们实际上定义了接口对象,这允许Intellisense对注入的引用进行反射,断言它们至少在接口上定义了方法

我认为保存Intellisense的唯一选择是引用这些库定义的全局引用

更新

看起来Microsoft实际上使用了类型注释,允许您显式地将参数的类型引用到函数。我用jQuery测试了这个暗示引用的版本

/// <reference path="jquery-1.6.2-vsdoc.js" />

(function ($) {
    /// <param name="$" type="jQuery">
    ///     A rererence to jQuery
    /// </param>



})(jQuery);
//
(函数($){
/// 
///对jQuery的重新引用
/// 
})(jQuery);
jQuery intellisense版本声明jQuery的返回类型。假设Knockout具有定义类型的intellisense,您可以用相同的方式对函数进行注释。一般来说,我认为您可以这样声明对象类型:

var someObject = (function() {
    /// <returns type="someObject" />

    // implementation here, returning object
})();

function (a) {
    /// <summary>
    ///      This function requires a to be a reference to a someObject type
    /// </summary>
    /// <param name="param" type="someObject">
    ///     A reference to a someObject type
    /// </param>
    /// <returns type="String" />

    // we now have intellisense on a, treating it as someObject
}
var someObject=(函数(){
/// 
//在这里实现,返回对象
})();
职能(a){
/// 
///此函数要求将作为对someObject类型的引用
/// 
/// 
///对someObject类型的引用
/// 
/// 
//我们现在在一个物体上有了智能感知,把它当作某种物体
}

因此,如果您准备完成添加注释的过程,您可以让Intellisense开始工作。

非常好的答案。谢谢Matt。我用一个可能的解决方案更新了我的答案。希望这有帮助。谢谢你的更新,马特。我添加了jQuery引用,jQuery intellisense现在可以工作了。但是,添加对knockout的引用,然后在函数中添加“//”,仍然不会触发intellisense。我只是得到了所有对象都得到的通常的“构造函数、hasOwnProperty等”列表
var someObject = (function() {
    /// <returns type="someObject" />

    // implementation here, returning object
})();

function (a) {
    /// <summary>
    ///      This function requires a to be a reference to a someObject type
    /// </summary>
    /// <param name="param" type="someObject">
    ///     A reference to a someObject type
    /// </param>
    /// <returns type="String" />

    // we now have intellisense on a, treating it as someObject
}