较早的答案是正确的,但我经常将函数传递给自定义绑定(检查权限的函数,或根据其他内容确定要执行的操作等)。我真正需要的是解开任何函数,即使它不是可观察的。
以下递归展开所有内容:
ko.utils.unwrapFunction = function (func) {
    if (typeof func != 'function') {
        return func;
    }
    else {
        return ko.utils.unwrapFunction(func());
    }
};
这是我编写的一个简单自定义绑定的示例:
//replaces single and double 'smart' quotes users commonly paste in from word into textareas and textboxes with normal text equivalents
//USAGE:
//data-bind="replaceWordChars:true
//also works with valueUpdate:'keyup' if you want"
ko.bindingHandlers.replaceWordChars = {
    update: function (element, valueAccessor, allBindingsAccessor, viewModel) {
        var bindingValue = ko.utils.unwrapFunction(valueAccessor);
        if (bindingValue) {
            $(element).val(removeMSWordChars(allBindingsAccessor().value())); //update DOM - not sure why I should need to do this, but just updating viewModel doesn't always update DOM correctly for me
            allBindingsAccessor().value($(element).val()); //update viewModel
        }
    }
}
这种方式 bindingValue 总是包含一个值。我不需要担心我是否传入了一个函数、一个 observable、一个值,甚至一个 observable 中的函数。这将正确展开所有内容,直到它到达我想要的对象。
希望能帮助某人。