基本理解javascript中的函数和声明

时间:2015-04-14 12:02:34

标签: javascript jquery mvvm knockout.js

我对javascript中的函数和变量声明缺乏一些基本的理解,并且我很难真正理解它。

我有这个函数“urlParam”,我把它放在一个通用文件('reusable.js')中重用:

(function (ko, $) {
    var urlParam = function (name, w) {
        w = w || window;
        var rx = new RegExp('[\&|\?]' + name + '=([^\&\#]+)'),
            val = w.location.search.match(rx);
        return !val ? '' : val[1];
    }
})(ko,jQuery);

然后我有一个viewModel,我想访问这个函数,放在一个文件'viewmodel.js'中:

ViewModel = function(){
     var userId = urlParam("UserId");
};

在我的view.html中,我包含两个文件,然后在html之后,我将视图模型绑定到视图:

ko.applyBindings(new ViewModel());

这会导致引用错误:ReferenceError: urlParam is not defined

但是如果我将urlParam函数放在(function(ko,$){})之外(ko,jQuery);声明它完美无缺。

(function () {})();做了什么?

2 个答案:

答案 0 :(得分:4)

它被称为立即调用函数表达式。

What is the (function() { } )() construct in JavaScript?

表达式创建一个新的作用域,并且可以访问通过外括号传递到内括号的参数,以及作用域链中的任何变量,但是你无法访问函数中的变量,如它们隐藏在函数的范围内。

尝试这样的事情:

var urlParamVar = (function (ko, $) {
    var urlParam = function (name, w) {
        w = w || window;
        var rx = new RegExp('[\&|\?]' + name + '=([^\&\#]+)'),
            val = w.location.search.match(rx);
        return !val ? '' : val[1];
    }
    return urlParam;
})(ko,jQuery);

这样你返回urlParam并将其设置为将保存该函数的变量urlParamVar。

但这并不是一种非常有条理的方式来做你正在尝试做的事情。

答案 1 :(得分:1)

你必须在没有" var"制作全球职能

(function (ko, $) {
  urlParam = function (name, w) {
    //.......
  }
})(ko,jQuery);