Javascript 在同一个函数中使用用于命名函数的变量名有何意义?

Javascript 在同一个函数中使用用于命名函数的变量名有何意义?,javascript,angularjs,ngresource,Javascript,Angularjs,Ngresource,在这个代码段中,从中,函数的名称是user,在函数中,它们使用的是相同名称的变量 var User = $resource('/user/:userId', {userId:'@id'}); var user = User.get({userId:123}, function() { user.abc = true; user.$save(); }); 这有什么意义?“用户”不是函数名,而是从给定资源读取的对象名 说得对。当http请求完成时,用户成为充满数据的代理 第二个参数-函数是

在这个代码段中,从中,函数的名称是
user
,在函数中,它们使用的是相同名称的变量

var User = $resource('/user/:userId', {userId:'@id'});
var user = User.get({userId:123}, function() {
  user.abc = true;
  user.$save();
});
这有什么意义?“用户”不是函数名,而是从给定资源读取的对象名

说得对。当http请求完成时,用户成为充满数据的代理

第二个参数-函数是在用户成功加载后调用的回调函数,所以用户成为完全创建的对象

因此,当调用.get时,其工作原理与此完全相同:

  • 使用“代理”创建变量用户
  • 从/user/123读取用户
  • 使用数据和“资源方法”($save,$delete…)实现用户变量
  • 调用给定函数回调,其中:
    • 在用户对象中设置abc
    • 将其保存回资源($save-POST-to/user/123)
在文档中,您可以阅读:- (零件使用/退货)

“重要的是要认识到调用$resource对象方法 立即返回空引用(对象或数组,具体取决于 从服务器返回数据后,现有的 引用用实际数据填充。这是一个有用的技巧 因为资源通常分配给一个模型,然后 由视图渲染。具有空对象不会导致渲染, 一旦数据从服务器到达,对象就会被填充 随着数据和视图自动重新呈现自身,显示 新数据。这意味着在大多数情况下,一个人不必写 操作方法的回调函数。“


“user”不必作为参数传递,因为user是在调用回调之前设置的。

调用
user.get()时
,它返回一个承诺,并继续处理。当该承诺解析时,angular将您设置的变量(在本例中为
user
)设置为解析值。它还调用成功回调函数,以便您可以在该点安全地更改它

使用上面的例子,下面是发生的情况

  • 调用`User.get({userId:123})
  • User.get
    返回一个承诺,并将
    var User
    设置为该承诺
  • 继续处理
  • 承诺解决了,比如说对
    {id:123,name:“Imray”}
  • angular将变量
    user
    设置为
    {id:123,名称:“Imray”}
  • angular调用您的成功回调,其中您:
  • user.abc
    设置为
    true
    ,这样您的对象现在是
    {id:123,名称:“Imray”,abc:true}
  • 调用
    user.$save()
    ,将其保存到服务器等

  • 本质上,它没有什么问题,只是注意执行顺序。

    看起来您在get回调中遗漏了函数参数:
    User.get({userId:123},function(User){
    不完全是。回调函数的内容指的是
    var user
    。我认为@Rasalom有权使用它,这是文档中的一个输入错误——如果您在文档中进一步搜索
    $save
    ,您将看到该代码重复,但
    user
    被传递到回调函数中。它明确指向函数param,这里有一个例子:@Blazemonger所以Angular文档中又出现了一个错误?我的意思是,就像用户在从资源读取之前被分配一样。这不是承诺。它只是一个空对象,您可以将其传递到模板,并在读取资源完成时填充(和更新)它)我已经添加了文档的确切部分,因此回调运行时好像它完全独立于它所在的函数一样?好像它是一个写了几行的随机函数?几乎是。它运行时是独立的,但仅当
    User.get()时才调用
    已解析。啊哈。这似乎是一种奇怪的方法,但我想它会起作用。它提供了一些选项。您可以使用
    var user=user.get({userId:123});
    并依赖angular来解析它,或者在解析时使用回调来进行额外处理。或者两者都可以。文档中的示例旨在说明这两种方法。