我的页面上散布了一些javascript片段 - 很多都包含在我自己的.js文件中,但是我在网上找到的一些东西直接放在页面上.
我不太熟悉javascript与页面的交互方式 - 添加内联脚本或添加对外部文件的引用是否有区别?
可能重复:
.NET中的"闭包"是什么?
我目前正在研究lambda表达式,并且封闭一词不断涌现.有人可以用真正简单的语言向我解释.
我正在创建一个jQuery插件.到目前为止它工作正常,但我对我做事的方式有疑问:
jQuery.fn.myMethod = function() {
return this.each(function(){
MyScope.doSomething(jQuery(this).attr("id"));
});
};
var MyScope = {
// The functions contained in MyScope are extremely linked to the logic
// of this plugin and it wouldn't make a lot of sense to extract them
doSomething: function(id){
// something
doSomethingElse(23);
// some more code
doSomethingElse(55);
},
doSomethingElse: function(someInt){
// some code
}
};
Run Code Online (Sandbox Code Playgroud)
我使用MyScope存储我的所有"私人"功能.我不希望用户能够去$("p").doSomething(),但我确实需要使用它们.
我可以移动myMethod函数中的所有内容,但它会创建一个100行长的函数,人们会讨厌它.
在这种情况下,最佳做法是什么?关于这个,有没有很棒的教程?
正如你将看到我是AngularJS,JS和web开发中的新手=)真的很抱歉,但我试着.
我尝试用AngularJS控制器构建一个庞大的webform(大约200个不同的字段).我需要从控制器访问根数据源.AngularJS团队要求不要仅仅为了存储数据而提供服务,但我想为加载和保存数据提供服务(在服务器上启动.json文件).
服务:
AppName.factory('MasterData', ['$rootScope', '$http', '$q', '$log',
function($rootScope, $http, $q, $log) {
var responseData;
$http.get('/getdata.php').then(function (response) {
responseData = response.data;
console.log(response.data);
});
return responseData;
}]);
Run Code Online (Sandbox Code Playgroud)
控制器:
AppName.controller('justController', ['$scope', 'MasterData', '$log',
function ($scope, MasterData, $log) {
$scope.data = MasterData.justControllerSectionData;
console.log(MasterData);
}
]);
Run Code Online (Sandbox Code Playgroud)
控制器返回undefined.但是来自服务的console.log返回对象.我觉得问题太容易了,但是我找不到如何解决它:(我也不能使用像.getData()这样的函数从控制器到服务,因为每次控制器加载时它都会从服务器询问数据.我在AngularJS应用程序中有12-14个控制器的路由(完整的webform除以部分),我认为从后端获取数据一次是好的.
PS我觉得承诺有问题,但是当我尝试使用这样的代码时:
var defer = $q.defer();
$http.get('/getdata.php').success(function(data){
defer.resolve(data);
});
return defer;
Run Code Online (Sandbox Code Playgroud)
我有决心,拒绝等对象.真的无法理解我能用它做什么:(
帮我在控制器中获取数据:)
在PHP中,我们有一个简洁的use关键字,允许在使用闭包时使用"外部"变量,如下所示:
$tax = 10;
$totalPrice = function ($quantity, $price) use ($tax){ //mandatory 'use'
return ($price * $quantity) * ($tax + 1.0);
};
Run Code Online (Sandbox Code Playgroud)
如果我们省略该use ($tax)部分,它将抛出一个错误,我非常喜欢.
类似地,在C++ 11中,我们也这样做,使用括号指定称为捕获列表的外部变量:
float tax = 10;
auto totalPrice = [tax](int quantity, float price){ //mandatory []
return (price*quantity) * (tax + 1.0);
};
Run Code Online (Sandbox Code Playgroud)
与在php中一样,如果省略捕获列表,则会抛出错误.
在Javascript中,我们没有等效于此use关键字(或c ++ []),我们只是这样做:
var tax = 10;
var totalPrice = function (quantity, price){ //no need for 'use' or similar
return (price * quantity) * (tax …Run Code Online (Sandbox Code Playgroud) 我想从我的视图中将参数传递给jQuery document.ready()函数:
$(document).ready(function (parameter){
$('select[name=Product]').val(parameter);
});
Run Code Online (Sandbox Code Playgroud)
如何从我的View中触发事件并传递参数?我使用Razor作为View引擎.
谢谢
我今天发现了一些非常奇怪的事情:如果使用构造函数和new关键字创建对象,但是return构造函数中的函数,它的行为如下:
this在构造函数中维护引用,则this引用从构造函数正确创建的对象.这是你期望从中返回的new.这是一个例子:
function Constructor() {
var self = this;
this.name = 'instance';
return function() {
return self;
}
}
Run Code Online (Sandbox Code Playgroud)
因此,如果您像这样实例化:var instance = new Constructor()
将产生以下结果:
typeof instance //returns "function"
typeof instance() //returns "object"
instance() //returns { name: 'instance' }
Run Code Online (Sandbox Code Playgroud)
所以我猜我有三个问题:
我有一个问题:在Javascript中限制范围的更好方法是:使用这样的命名空间:
var NAMESPACE = {};
NAMESPACE.foo = function() {
console.log('Hello');
}
NAMESPACE.foo();
Run Code Online (Sandbox Code Playgroud)
或者我应该使用这样的自我调用功能
(function() {
function foo() { console.log('Hello'); }
foo();
})();
Run Code Online (Sandbox Code Playgroud)
拥有一个命名空间总是好的,或者如果我只使用一个很大的自我调用函数来放置我所有的东西,我可以省略它吗?
在闭包标签维基页面中,它显示"jQuery本身就是一个大关闭".
但是也承诺关闭?你能解释一下为什么或为什么不解释?这就是我理解闭包的方法:为变量分配一个函数并在不同的环境中重用它.Promise可以做到这一点$.ajax(),但我无法在stackoverflow中找到将promise作为闭包引入的任何地方.也许是因为有像承诺的其他功能$.Deferred(),resolve()以及fail()扩展其功能,而不仅仅是一个简单的函数传递?
我正在开发一个AngularJS应用程序.要在生产中发布代码,我正在使用这个Grunt配置/任务:
grunt.registerTask( 'compile', [
'sass:compile', 'copy:compile_assets', 'ngAnnotate', 'concat:compile_js', 'uglify', 'index:compile'
]);
Run Code Online (Sandbox Code Playgroud)
调试真的很难,对于那些已经遇到过这些问题并且可以指向某个方向的人来说,这是一个问题.
我的主要模块包括那些子模块:
angular
.module('controlcenter', [
'ui.router',
'ui.bootstrap',
'templates-app',
'templates-common',
'authentication',
'api',
'reports',
'interceptors',
'controlcenter.websites',
'controlcenter.users',
'controlcenter.campaigns',
'controlcenter.reports',
'controlcenter.login'
])
.run(run);
Run Code Online (Sandbox Code Playgroud)
我得到的错误如下:
Uncaught Error: [$injector:modulerr] Failed to instantiate module controlcenter due to:
Error: [$injector:modulerr] Failed to instantiate module controlcenter.websites due to:
Error: State 'websites'' is already defined
Run Code Online (Sandbox Code Playgroud)
如果我删除网站模块,我得到controlcenter.users相同的错误.
我正在使用它ui-router来处理应用程序内部的路由.
在我的构建过程(用于集成测试)之后,一切正常:
grunt.registerTask( 'build', [
'clean', 'html2js', 'jshint', 'sass:build',
'concat:build_css', 'copy:build_app_assets', 'copy:build_vendor_assets',
'copy:build_appjs', 'copy:build_vendorjs', 'copy:build_vendorcss', 'index:build', 'karmaconfig',
'karma:continuous'
]);
Run Code Online (Sandbox Code Playgroud)
那么也许 …