IE 11 angular 范围 return 函数而不是 object

IE 11 angular scope return function instead of object

$scope.updateCart = function() {

    item = $scope.productData;

此代码片段 returns 是 IE 11 中的一个函数,而不是像 chrome

上那样 object

导致下面的$http请求发送乱码数据。

使用https://ajax.googleapis.com/ajax/libs/angularjs/1.5.6/angular.min.js

上一个标题:IE 11 jquery 'Argument not optional' 错误

以下代码:

    dt = $.param({
            shopid: shop_id,
            mtd: method,
            item: item
        });

抛出以下错误:

TypeError: Argument not optional
   at add (https://code.jquery.com/jquery-1.9.1.js:7340:4)
   at buildParams (https://code.jquery.com/jquery-1.9.1.js:7392:3)
   at jQuery.param (https://code.jquery.com/jquery-1.9.1.js:7360:4)
   at $scope.updateBACart (http://127.0.0.1:6636/js/baCartNg.js?v=1478430971:104:3)
   at fn (Function code:2:216)
   at expensiveCheckFn (http://code.angularjs.org/1.5.5/angular.js:15485:11)
   at callback (http://code.angularjs.org/1.5.5/angular.js:25018:17)
   at Scope.prototype.$eval (http://code.angularjs.org/1.5.5/angular.js:17229:9)
   at Scope.prototype.$apply (http://code.angularjs.org/1.5.5/angular.js:17329:13)
   at Anonymous function (http://code.angularjs.org/1.5.5/angular.js:25023:17)

错误在 IE 11 中抛出,但在 chrome

中没有

根据https://docs.angularjs.org/api/ng/service/$httpParamSerializerJQLike

我更改代码:

    dt = $httpParamSerializerJQLike({
            shopid: shop_id,
            mtd: method,
            item: item
        });

现在代码不会抛出错误,但请求是

   item: %0Afunction+item()+%7B%0A++++%5Bnative+code%5D%0A%7D%0A
   mtd: add
   shopid: 1

而不是项目数据。

解决方案是item1 = $scope.productData;而不是item = $scope.productData;

出于某种原因,IE11 将 item 设置为 function item() { [native code] }

当然,你可以将你的变量命名为 item1 而不是 item 并且现在可以使用......但这并没有告诉你什么是 错误 用你的原始代码。

真正的问题是您分配给全局变量而不是局部变量。当您使用:

function () {
    item = (2 + 2); // or some other value
}

之前没有使用 var item,您实际上是在分配给 全局 变量 item。在浏览器上下文中,全局作用域是 window 对象,所以上面等价于:

function () {
    window.item = (2 + 2);
}

在 Chrome 中没有问题:最初没有 window.item,所以这个赋值创建了它。然而在 IE11 中,window 已经有一个 item 属性,而且它是 只读 !这意味着对全局 item 变量的所有赋值都被静默忽略,因此 window.item 始终具有其原始函数值。

您的 "solution" 通过使用不同的变量名来解决这个问题。更好、更健壮和更有效的解决方案是使用 locally scoped 变量代替:

function () {
    var item = (2 + 2); // does NOT create a global item variable
}

作为一个好习惯,请确保在声明新变量时始终使用var,以避免意外创建全局变量。更好的是,在你的函数中添加一个 "use strict" 指令,这样这些类型的赋值就会抛出错误,而不是默默地忽略错误。

如果你真的需要创建一个全局变量,显式地分配给 window 对象本身的 属性:

function () {
    window.globalItem = (2 + 2);
}