小编mac*_*ost的帖子

(JS)闭包是否需要函数内部的函数

我对封闭的固有概念有点困难.我得到了基本的想法,但事情就是这样:我认为,从技术上讲,每个Javascript函数中都有"闭包".引用维基百科:

在计算机科学中,闭包(也是词法闭包,函数闭包或函数值)是一个函数以及该函数的非局部名称(自由变量)的引用环境.据说这种功能是"封闭"其自由变量.

因此,既然您可以在函数内部定义变量,那么它们将"关闭"到代码的其余部分,因此我将其视为闭包.因此,据我所知:

(function(){var a = 1;}())
Run Code Online (Sandbox Code Playgroud)

是一个(不是非常有用)闭包的例子.或者哎呀,即使只是这样:

function(){var a = 1;}
Run Code Online (Sandbox Code Playgroud)

但是,我认为我的理解可能是错误的.其他人告诉我,对于一个关闭它必须坚持一个状态,所以因为没有任何东西超出该代码,它不是真正的闭包.这表明你需要:

function(foo){foo.a = 1;}(bar); // bar.a = 1
Run Code Online (Sandbox Code Playgroud)

甚至(以确保不可修改):

function(foo){var a = 1; bar.baz = function() { return a}}(bar); // bar.baz() = 1
Run Code Online (Sandbox Code Playgroud)

因此,从技术上讲(我知道几个例子实际上毫无意义,但是)上述哪些例子实际上是闭包的例子.并且闭包只需要是一个空间(即在JS函数内),其中可以存储无法从外部访问的变量,或者持久性是闭包定义的关键部分吗?

编辑

刚刚注意到Stack Overflow上"closures"标签的维基定义:

闭包是一个第一类函数,它引用(关闭)变量来自定义它的作用域.如果闭包在其定义范围结束后仍然存在,则它关闭的变量也将继续存在.

虽然SO维基当然不是最终权威,但第一句似乎与我对该术语的理解相关.第二句则意味着封闭如何被使用,但它并没有看起来像一个要求.

编辑#2

如果从这里的变化答案,维基百科答案和标签答案中不清楚,似乎没有就"封闭"这个词甚至意味着什么达成明确的共识.所以虽然我很欣赏到目前为止的所有答案,但如果你按照作者对闭包的定义来说它们都是有意义的,我猜我真正想要的是......是否有任何实际的"权威"定义(如果是这样,它如何适用于以上所有)?

javascript closures

8
推荐指数
1
解决办法
607
查看次数

模板两个模型在一个视图中 - Backbone/Marionette

我试图在一个视图中使用两个模型,并使用它们两个模板.我和Marionette一起工作.这是我初始化视图:

main_app_layout.header.show(new APP.Views.HeaderView({
 model: oneModel,
 model2 : twoModel}
));
Run Code Online (Sandbox Code Playgroud)

这是我的观点:

APP.Views.HeaderView = Backbone.Marionette.ItemView.extend({

    template : '#view_template',

    className: 'container',


    initialize: function() {
               //This correctly logs the second model
                console.log(this.options.model2);

    }

});
Run Code Online (Sandbox Code Playgroud)

这是模板:

 <script id="view_template" type="text/template">
        <p>{{twoModel_label}} {{oneModel_data}}</p>
        <p>{{twoModel_label2}} {{oneModel_data2}}</p>
    </script>
Run Code Online (Sandbox Code Playgroud)

它使用oneModel数据正确呈现所有内容,但不会呈现第二个,即使它正确记录它.我正在使用胡子作为我的模板语言.

有人可以帮忙吗?

javascript model-view-controller backbone.js marionette

8
推荐指数
1
解决办法
6157
查看次数

如何防止$ .ajax将[]添加到我的密钥名称(没有processData:false)?

如果我尝试使用$.ajaxPOST一个数据字典,如:

{
    list: ["fake_id_0"],
    mapType: "fakeToRealId"
}
Run Code Online (Sandbox Code Playgroud)

jQuery做了一些奇怪的事情; 它将数据转换为:

{
    list[]: ["fake_id_0"],
    mapType: "fakeToRealId"
}
Run Code Online (Sandbox Code Playgroud)

如您所见,它为list键添加括号,但不是mapType键.现在在一般的REST意义上,是的,人们通常使用括号来命名具有数组值的键...但是我的服务器不能以这种方式工作,所以如果我尝试POST list[]我有问题.

我已经跟踪了这个问题,直到$.ajax处理parseData选项,在这段代码中:

// Convert data if not already a string
if ( s.data && s.processData && typeof s.data !== "string" ) {
    s.data = jQuery.param( s.data, s.traditional );
}
Run Code Online (Sandbox Code Playgroud)

如果我使用processData: false它确实跳过那个块......但是它也没有为我提供URLEncode我的数据.

所以,我的问题是:如何在没有jQuery的情况下进行$.ajax调用,processData: true修改我的密钥名称?或者失败了,我如何使用processData: false,但除了括号添加之外,仍然可以从该选项中获得所有效果?

PS或者,如果这是所有非标准的jQuery行为,由我所拥有的一些插件引起,请告诉我相反:-)

*编辑*

我回答了自己的问题,然后删除了答案,因为我意识到它有缺陷.我回答说设置选项traditional:true(在$.ajax调用中)修复括号,它确实...但它也有副作用,即它不会序列化嵌套对象. …

ajax jquery

8
推荐指数
1
解决办法
2259
查看次数

TinyMCE:如何在编辑器中阻止`<br data-mce-bogus="1">`文本?

我有一个包含几个TinyMCE(v4)编辑器的页面,这些编辑器都很好用......直到我尝试添加:

inline: true
Run Code Online (Sandbox Code Playgroud)

他们的配置.当我这样做时,内联部分工作得很好(工具栏已经消失,然后在我关注编辑器时出现),但由于一些奇怪的原因,编辑器在那时停止工作.在编辑器中我看到:

<br data-mce-bogus="1">
Run Code Online (Sandbox Code Playgroud)

但我无法编辑该文本,或添加新文本,或者根本无法使用编辑器执行任何操作.

如果我删除inline: true,我可以让编辑器再次工作,但我真的想要内联效果.有没有人知道如何在inline不破坏编辑的情况下获得成功?

tinymce tinymce-4

8
推荐指数
2
解决办法
1万
查看次数

有没有办法重新订购Git stashes?

在Git中,可以制作多个藏匿处:

git stash save "quick temp stash"
git stash save "another quick temp stash"
git stash save "This is important but I need to put it on the back burner"
git stash save "This is almost certainly garbage, but just in case ..."
Run Code Online (Sandbox Code Playgroud)

现在,我知道我可以按任何顺序取回那些藏匿物:

git stash pop stash@{3} # recover quick temp stash
git stash pop stash@{2} # recover another quick temp stash
Run Code Online (Sandbox Code Playgroud)

但显然更方便的语法更可取:

git stash pop
Run Code Online (Sandbox Code Playgroud)

这不仅仅是因为打字的次数较少,而且因为需要的思维也较少:如果我有几个藏匿处,我必须仔细查看它们,也许git stash show还有一些,直到找到我想要的那个.但是,如果我只是将最近的"临时"藏匿在顶部(接着是下一个临时藏匿等),我根本不需要思考; 我只是pop.

所以,我的问题是,有什么方法可以重新订购我的藏匿处,以便我可以考虑在我保存它们时应该"弹出"它们,而不是在我"弹出"它们的时候.这将允许我仍然保存"这几乎肯定是垃圾,但以防万一......"和"这很重要,但我需要把它放在后面","但是在藏匿列表的后面,他们在不要复杂访问更简单的快速存储.

git git-stash

8
推荐指数
1
解决办法
856
查看次数

如何根据扩展名限制S3中的文件?

我正在使用Amazon S3存储桶提供静态网站服务.我知道我可以限制对某些"文件夹"的读取权限(真正的密钥,因为S3没有文件夹)但我真正想做的是通过文件扩展名限制访问.

换句话说,我想说"只要该文件以htm/css/js/png结尾","为这个桶中的任何文件提供对每个人的读访问权"; 那可能吗?

(顺便说一句,我担心的是我会不小心上传一个.git文件,或类似我不想向世界展示的东西;设置安全策略以防止显示这些文件似乎比信任我自己更安全永远不会意外上传错误的文件).

amazon-s3

7
推荐指数
1
解决办法
2605
查看次数

不同类型的测试(例如,单元,功能,集成等)文档

几年前,我在Google上看到了这篇很棒的(PDF)文档.该文档在一个页面中解释了所有各种类型的软件测试的含义(例如,功能测试与集成测试和单元测试之间的区别是什么......).这是一个非常方便的参考,但当然我没有保存链接到它,现在我无法找到它谷歌它(哦具有讽刺意味着无法谷歌谷歌文件).

现在我知道对于这个问题有很好的答案,但是我特意寻找一个单页,打印格式的指南,我可以挂在办公室,而不是SO答案.

任何人都可以向我指出我正在考虑的Google文档,或任何其他良好的单页软件测试类型细分?

testing

7
推荐指数
1
解决办法
3万
查看次数

如何在服务器上捕获React propTypes警告?

在服务器上呈现React组件时,所有propTypes警告消息都会降为常规输出或process.stdout.例如,这仅在终端或一般应用程序日志中可见:

Warning: Failed propType: Required prop `title` was not specified in `Page`.
Run Code Online (Sandbox Code Playgroud)

有没有办法捕捉这些警告并转换它们或将它们传导到另一个方向?例如,我想将应用程序日志和React(作为模板引擎)日志分开.我该怎么做?

reactjs react-proptypes

7
推荐指数
1
解决办法
2071
查看次数

在React中读取表单数据的最佳实践

我正在尝试在React中做一些在任何其他框架中都非常简单的事情:我想从表单中收集一堆值.

以前我用Backbone View做过这种事情,它非常简单:

readFormValues: function() {
    this.data.foo = this.$('[name="foo"]').val();
    this.data.bar = this.$('[name="bar"]:checked').val();
});
Run Code Online (Sandbox Code Playgroud)

但在React中我似乎无法找到一种简单的方法.看来我唯一的选择是......

注意:格式化的道歉:代码块和列表不能很好地一起播放:-(

  1. 完全绕过React并使用jQuery + e.target访问表单:

    handleSubmit: function(e) {

    var $form = $(e.target).parents('form:first');

    this.data.foo = $form.find('[name="foo"]);

    },

    render: function() {

    return <form onSubmit="handleSubmit"><input name="foo"/></form>;

    }

    这很有用,而且很简单,但是当我应该使用React时,我觉得我绕过了React并使用了JQuery.

  2. 为每个表单控件提供回调:

    handleFooClick: function(e) {

    this.data.foo = event.target.value;

    },

    render: function() {

    return <form><input name="foo" onChange="handleFooChange"/></form>;

    }

    这似乎是React/Flux的方式,但感觉就像一堆疯狂的不必要的工作.在我的Backbone示例中,每个表单控件只需要一行,但是使用这种方法我构建的每个最后一个控件都必须有自己的onChange处理程序(我必须在处理它时将该处理程序挂钩到每个元素).

    编辑:这种方法的另一个缺点是在回调内部this.props并且this.state不会指向我的表单控件的props/state(它将指向输入的 props/state).这意味着我不仅要为每个输入编写一个处理程序,并在渲染时将该回调添加到每个输入,但我还必须将我的数据对象传递给每个输入!

  3. 使用refs:

    handleSubmit: function(e) {

    this.state.data.foo = this.refs.foo.value;

    },

    render: function() {

    return <form><input ref="foo"/></form>;

    } …

reactjs

7
推荐指数
1
解决办法
1640
查看次数

Reacts`propTypes`和`defaultProps`应该与Flowtype一起使用,还是Flowtype足够全面?

考虑一个简单的例子,例如:

class CommentAreaComponent extends React.Component {
static propTypes = {
    id: PropTypes.string.isRequired,
    loading: PropTypes.bool,
};

static defaultProps = {
    loading: false,
};
Run Code Online (Sandbox Code Playgroud)

在构造函数中,我可以定义这样的东西来实现(我认为)同样的事情:

class MyComponent extends React.Component {
    constructor({
        loading = false,
    }:{ 
        id:string, 
        loading?:boolean 
    }) {
        super(arguments[0]);
    }
}
Run Code Online (Sandbox Code Playgroud)

第二个示例仅使用Flowtype.使用Reacts PropTypes和DefaultProps是否有优势?或者我可以在使用FlowType时完全删除它们吗?

javascript reactjs flowtype react-proptypes

7
推荐指数
1
解决办法
2469
查看次数