Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/432.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_Jquery_Mvvm_Knockout.js - Fatal编程技术网

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

基本了解javascript中的函数和声明,javascript,jquery,mvvm,knockout.js,Javascript,Jquery,Mvvm,Knockout.js,我对javascript中的函数和变量声明缺乏一些基本的理解,我正在努力真正理解它 我将此函数“urlParam”放在一个要重用的常规文件('reusables.js')中: (function (ko, $) { var urlParam = function (name, w) { w = w || window; var rx = new RegExp('[\&|\?]' + name + '=([^\&\#]+)'),

我对javascript中的函数和变量声明缺乏一些基本的理解,我正在努力真正理解它

我将此函数“urlParam”放在一个要重用的常规文件('reusables.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");
};
在my view.html中,我包含这两个文件,然后在html之后,我使用以下内容将视图模型绑定到视图:

ko.applyBindings(new ViewModel());
这会导致引用错误:
ReferenceError:urlParam未定义

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


这是什么
(函数(){})()真的吗?

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

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

试着这样做:

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,该变量将保存该函数


但这并不是一种很好的结构方式来完成您试图完成的任务。

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

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

试着这样做:

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,该变量将保存该函数

但这并不是一种很好的结构方式来完成您试图做的事情。

您必须在不使用“var”的情况下尝试这一点,才能生成全局函数

(function (ko, $) {
  urlParam = function (name, w) {
    //.......
  }
})(ko,jQuery);
您必须在不使用“var”的情况下尝试此操作才能生成全局函数

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

这里有一篇很好的SO文章:它被称为立即调用函数表达式。基本上,你把一个匿名函数用括号括起来,然后立即调用它。这是一个创建时执行的
匿名
函数。这里有一篇很好的SO文章:它被称为立即调用函数表达式。基本上,你把一个匿名函数用括号括起来,然后立即调用它。它是一个创建时执行的
匿名
函数